2014-01-27 147 views
0

也许这是一个初学者的问题,但我需要一些关于这个问题的帮助。创建从基类继承的对象

假设有从本身从C类继承现在

在类的构造函数看起来像这样一切都很好B类继承A类:

A::A(params) 
    :B(params) 
{ 
} 

接下来,我试过,但失败:

A::A(params) 
    :C(params) 
{ 
} 

为什么我不能忽略继承的B在这里 - 或者是有办法使这个可能吗?定义如下不起作用,这里编译器抱怨C是已经是一个基类的:

class A : B, C 
+0

“它失败”不是一个很好的问题描述。什么是你看到的真正的错误? – Jon

+0

B有一个非默认构造函数吗? – Gasim

+1

@Jon,“type'C'不是'A'的直接或虚拟基础” – Shoe

回答

0

为什么我不能忽略B中的inheritacne - 或者有什么办法可以做到这一点?

因为类只能决定如何构造它们的直接子对象。 A的直接子对象是B,而BCB对象也需要构建,你不能绕过它。

你得到了error,基本上抱怨这个。

定义如下不起作用,这里编译器抱怨C是已经是一个基类的:class A : B,C

有了:

class A : B, C 

你实际上是宣告私人多重继承。而且既然你说B已经有一个子对象(继承自)C,编译器抱怨从C继承A是没用的。

但请记得总是指定private/protected/public种类的继承,以避免混淆。默认情况下,class es的继承为privatestruct s为public。所以上面的代码对应于:

class A : private B, private C 
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) { ... } 
}; 

实在是没有别的办法....

+0

正如Jeffrey在他的评论中所说的,当C是B的虚拟基类时,我可以在构造函数初始化程序中调用C的构造函数A列表。 – sajas

+0

确实。虚拟基地是一种例外。这是一个复杂的情况。你确定你确实需要这个吗?首先阅读这篇文章,并提供更多证据表明您需要这些。 –