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
提供默认构造函数,或者在classC
s 初始化列表中调用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++多级虚继承编译问题的主要内容,如果未能解决你的问题,请参考以下文章