这可能是一个初学者的问题,但我需要一些关于这个问题的帮助。
假设有一个继承自B类的A类,它本身继承自C类。
现在当A类构造函数看起来像这样时,一切都很好:
A::A(params)
:B(params)
{
}
接下来我尝试了这个,但它失败了:
A::A(params)
:C(params)
{
}
为什么我不能忽略B中的继承 - 或者有没有办法使这成为可能?如下定义A不起作用,这里编译器抱怨C已经是A:
的基类class A : B, C
答案 0 :(得分:0)
你应该写:
class C
{
public: C(ParamType param) { ... }
};
class B : public C
{
public: B(ParamType param) : C(param) { ... }
};
class A : public B
{
public: A(ParamType param) : B(param) { ... }
};
真的没有别的办法......
答案 1 :(得分:0)
为什么我不能在这里忽略B中的遗传物 - 或者有没有办法使这成为可能?
因为类只能决定如何构建 direct 子对象。 A
的直接子对象为B
,B
的直接子对象为C
。 B
对象也需要构建,你不能绕过它。
你得到的error,基本上都抱怨这个。
如下定义A不起作用,这里编译器抱怨C已经是A的基类:
class A : B,C
使用:
class A : B, C
您实际上声明了私有多重继承。既然你说B
已经有一个子对象(继承自)C
,那么编译器抱怨从C
继承A
是没用的。
但请记住始终指定private
/ protected
/ public
类型的继承,以避免混淆。默认情况下,class
es的继承为private
,而struct
的继承为public
。所以上面的代码对应于:
class A : private B, private C