为了账号安全,请及时绑定邮箱和手机立即绑定

c ++虚拟继承

c ++虚拟继承

C++
PIPIONE 2019-07-27 14:18:53
c ++虚拟继承问题:class Base {public:   Base(Base* pParent);   /* implements basic stuff */};class A : virtual public Base {public:   A(A* pParent) : Base(pParent) {}   /* ... */};class B : virtual public Base {public:   B(B* pParent) : Base(pParent) {}   /* ... */};class C : public A, public B {public:   C(C* pParent) : A(pParent), B(pParent) {} // - Compilation error here   /* ... */};在给定的位置,gcc抱怨它无法匹配函数调用Base(),即默认构造函数。但是C不直接从Base继承,只通过A和B.那么为什么gcc会在这里抱怨?想法?TIA / Rob
查看完整描述

3 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

virtual基类的特殊之处在于它们由最派生的类初始化,而不是由从虚拟基础继承的任何中间基类初始化。初始化一个碱基的正确选择是哪个潜在的多个初始化器?

如果正在构造的派生类最多的类没有在其成员初始化列表中列出它,则使用其默认构造函数初始化虚拟基类,该构造函数必须存在且可访问。

请注意,允许在构造函数的初始化列表中使用虚拟基本标识符,即使它不是相关类的直接基础。


查看完整回答
反对 回复 2019-07-27
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

您需要从C显式调用Base的构造函数:


class C : public A, public B {

public:

C(C* pParent) : Base(pParent), A(pParent), B(pParent) {}

/*... */

};


查看完整回答
反对 回复 2019-07-27
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

如果声明自定义构造函数,则禁用默认构造函数。在虚拟继承中,您需要直接调用虚拟继承的构造函数,否则它将不知道是由A还是由B初始化。


查看完整回答
反对 回复 2019-07-27
  • 3 回答
  • 0 关注
  • 737 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信