C++ 继承:调用基类构造函数时出错 C2614
c++ inheritance: error C2614 calling base class' constructor
我有一个基类' 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){};
};
相关文章:
- 访问者访问变体并返回不同类型时出错
- 在Linux for Windows上编译C++代码时出错
- 读取文件的最后一行并输入到链接列表时出错
- 重载操作程序时出错>>用于类中的字符串 memebr
- 调用专用模板时出错"no matching function for call to [...]"
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- LINK 尝试使用 OpenSSL evp aes 256 c++ 时出错
- 在Google Kick start中提交时出错
- 在c++中访问int到类对象的映射时出错
- 分段错误当我试图运行程序时出错
- 使用dynamic_cast和构造函数时出错
- CHECK(调用)函数在Google Colab中出错
- 用pybind11包装C++抽象类时出错
- 为x86而非x64编译时出错
- 从R调用C++函数并对其进行集成时出错
- 这个函数哪里出错了
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 为重写std::exception的库生成swig接口时出错
- 导入/导出变量时出错
- C++ 继承:调用基类构造函数时出错 C2614