我有一个基类'A',它有一个子类'B',它有一个子类'C',它有一个子类'D'。
我希望D调用'A的构造函数,
D(int x,int y):A(x,y){};
但是我收到错误消息: 错误C2614:'D':非法成员初始化:'A'不是基础或成员。
D可以调用任何'C'的构造函数,但这不是我想要的。 任何帮助都会受到超级赞赏。
答案 0 :(得分:3)
你被卡住了,这就是C ++的工作方式 - 你只能调用你的直接父母的构造函数。你可以菊花链它们,以便D调用C的构造函数,该构造函数调用B的构造函数来调用A的构造函数。
D(int x,int y):C(x,y){};
C(int x,int y):B(x,y){};
B(int x,int y):A(x,y){};
答案 1 :(得分:1)
正如Mark Ransom的answer所述,派生类只允许调用其基类的构造函数。
在您的情况下,您可以通过将继承层次结构中的构造函数参数传递给D
来解决问题,直到A
的构造函数被B
与这些参数一起调用。< / p>
另一种选择是创建一个protected
函数,比如说A::init( args )
可以直接调用D
。
答案 2 :(得分:1)
除了可以沿继承层次结构传递参数或在基类中具有受保护的成员函数之外,还可以使用虚拟继承来解决此问题。通过虚拟继承,可以直接从派生类调用所有基类构造函数,因此您不必遍历继承链。
class A
{
public: A(){}
public: A(int x, int y){}
};
class B : public virtual A
{
public: B(){}
};
class C : public virtual B
{
public: C(){}
};
class D : public virtual C
{
public: D(int x,int y):A(x,y){};
};