private 链式多继承以复用代码时碰到的问题

fallening fallening 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
大致这样的代码:
s2 在实现自己的算法的时候复用了s1的算法,而s3的算法则要复用s1 s2的算法,在继承的时候出现了问题

struct s1
{
// ...
protected:
int impl( int i )
{
if ( i > 10 )
return method1(i);
return method2(i);
}
private:
int method1( int i )
{
return i*i;
}
int method2( int i )
{
return i+i;
}
};

struct s2 : private s1
{
// ...
protected:
int impl( int i )
{
if ( i < 100 )
return method1(i);
return method2(i);
}
private:
int method1( int i )
{
return s1::impl(i) * i;
}
int method2( int i )
{
return i*i*i;
}
};

struct s3: private s1, private s2
{
public:
int operator()( int i )
{
return impl( i );
}
protected:
int impl( int i )
{
if ( i & 1 )
return method1( i );
return method2( i );
}
private:
int method1( int i )
{
return s1::impl(i) * i;
}

int method2( int i )
{
return s1::impl(i) & s2::impl(i) ^ i;
}
};

int main()
{
int ans = s3()(10);
return ans;
}


编译错误为:
引用
test.cc:44:1: warning: direct base ‘s1’ inaccessible in ‘s3’ due to ambiguity
test.cc: In member function ‘int s3::method1(int)’:
test.cc:60:30: error: cannot call member function ‘int s1::impl(int)’ without object
test.cc: In member function ‘int s3::method2(int)’:
test.cc:65:30: error: cannot call member function ‘int s1::impl(int)’ without object


具体的代码场景在: https://github.com/fengwang/random_variate_generator
中的文件:random_variate_generator / include / vg / distribution / t.hpp 中
为了实现 t 分布,需要用到正态,X^2和指数分布生成的算法,采用了私有继承产生了错误,因为X^2算法同样复用了正态分布的算法。


...全文

相关推荐

评论 3
收藏 已收藏
分享
返回顶部
fallening
C++ 语言 65,214 成员 250,514 内容