C++ 继承:调用基类构造函数时出错 C2614

c++ inheritance: error C2614 calling base class' constructor

本文关键字:出错 C2614 构造函数 基类 继承 调用 C++      更新时间:2023-10-16

我有一个基类' a ',它有一个子类'B',它有一个子类'C', 'C'有一个子类'D'。

我想让D调用A的构造函数

D(int x,int y):A(x,y){};

,但我得到错误信息:错误C2614: 'D':非法成员初始化:'A'不是基或成员。

D可以很好地调用任何C的构造函数,但这不是我想要的。

你被卡住了,这就是c++的工作方式——你只能调用你的直接父类的构造函数。你可以将它们菊花链,这样D调用C的构造函数,C的构造函数调用B的构造函数,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){};

正如Mark Ransom的回答所述,派生类只允许调用其基类的构造函数。

在您的例子中,您可以通过将构造函数参数沿继承层次结构向下传递给D来解决这个问题,直到B使用这些参数调用A的构造函数。

另一个选择是创建一个protected函数,比如A::init( args ),它可以被D直接调用。

除了选择在继承层次结构中传递参数或在基类中拥有受保护的成员函数之外,还可以通过使用虚拟继承来解决这个问题。使用虚拟继承,所有基类构造函数都直接从派生类调用,因此您不必遍历继承链。

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){};
};