C++虚拟继承下Child构造调用GrandParent无匹配函数错误解决
虚基类继承场景下构造函数编译报错解决
问题复现
现有类继承结构如下:GrandParent为虚基类,Parent、Child为非虚类,类定义代码:
class GrandParent { protected: explicit GrandParent(const float &max_dur); virtual ~GrandParent() {} private: const float _max_dur; }; class Parent : public virtual GrandParent { public: explicit Parent(const float &max_dur = 0); }; class Child : public Parent { public: explicit Child(const float &max_dur = 0); };
各构造函数的初始实现如下:
// GrandParent构造函数 GrandParent::GrandParent(const float &max_dur) : _max_dur{max_dur} {} // Parent构造函数 Parent::Parent(const float &max_dur) : GrandParent{max_dur} {} // Child构造函数 Child::Child(const float &max_dur) : Parent{max_dur} {} // 此处触发编译错误
编译报错信息:
error: no matching function for call to ‘GrandParent::GrandParent()’
错误原因
C++虚继承的核心规则要求:虚基类的构造函数必须由继承体系中的最派生类直接调用,中间层级父类对虚基类构造函数的调用会被编译器自动忽略。
上述代码中Child是当前继承链的最派生类,初始实现仅在Child构造的初始化列表中调用了Parent的构造函数,没有显式指定虚基类GrandParent的构造方式,编译器会默认尝试调用GrandParent的无参构造函数完成初始化,但GrandParent仅定义了带float参数的构造函数,无可用的无参构造函数,因此触发编译报错。
解决方案
在Child的构造函数初始化列表中,同时显式调用虚基类GrandParent和父类Parent的构造函数即可修复问题:
Child::Child(const float &max_dur) : GrandParent{max_dur}, Parent{max_dur} {}
注意:该写法是C++虚继承的标准规定,不属于不符合规范的跳代调用。
内容的提问来源于stack exchange,提问作者seht97
相关产品推荐
相关产品推荐

