C++多级虚继承编译问题

Posted

技术标签:

【中文标题】C++多级虚继承编译问题【英文标题】:C++ Multi-level virtual Inheritance compilation problem 【发布时间】:2018-10-12 13:37:05 【问题描述】:

我正在开发一个 C++ 项目,其中我正在使用多级继承。

这是我的示例代码:

class ClassA

public:
    ClassA(int a,int b) : sum(a + b) 
    virtual ~ClassA() = default;

    int sum;
;

class ClassB : virtual public ClassA

public:
    ClassB(int a, int b, int c) : ClassA(a, b), c(c) 

    int c;
;

class ClassC : virtual public ClassB

public:
    ClassC(int a,int b,int c) : ClassB(a, b, c) 
;

int main()

    ClassC objC(1, 2, 3);

    std::cout << "sum=" << objC.sum << std::endl;
    std::cout << "c=" << objC.c << std::endl;

谁能解释一下这段代码有什么问题。

错误:没有匹配函数调用'ClassA::ClassA()'ClassC(int a,int b,int c) : ClassB(a, b, c)

【问题讨论】:

"我无法编译" - 那么你应该在这里发布编译日志。编译器可能会解释问题所在。 你有什么编译器错误信息? 首先构建所有虚拟碱基。由于classC 没有在其初始化列表中列出classA,编译器会寻找不接受任何参数的classA 的构造函数——因为虚拟classA 将在尝试构造虚拟classB 之前构造,所以 classB 的构造 classA 不会发生。要解决编译错误,请为classA 提供默认构造函数,或者在classCs 初始化列表中调用classA 的构造函数(除了classB 的构造之外,而不是代替classB 的构造)。跨度> @Peter 谢谢。成功了 Why must virtual base classes be constructed by the most derived class?的可能重复 【参考方案1】:

来自Derived class:

所有虚拟基子对象在任何非虚拟基子对象之前初始化,因此只有最派生的类在其成员初始化列表中调用虚拟基的构造函数

所以你的类应该修改为:

ClassC::ClassC(int a, int b,int c):ClassA(a, b), ClassB(a, b, c) 

【讨论】:

以上是关于C++多级虚继承编译问题的主要内容,如果未能解决你的问题,请参考以下文章

多级继承 C++

一文读懂C++虚继承的内存模型

一文读懂C++虚继承的内存模型

一文读懂C++虚继承的内存模型

一文读懂C++虚函数的内存模型

C++中的继承和纯虚函数