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

虚继承,为何报错,说“Person::Person”: 没有合适的默认构造函数可

虚继承,为何报错,说“Person::Person”: 没有合适的默认构造函数可

C++
MOCKINGT 2017-08-22 23:28:11
#include <iostream>#include <stdlib.h>#include <string>using namespace std;/*** 定义人类: Person*/class Person{public:    Person(string name) :m_strName(name)    {        cout << "Person" << endl;    }    ~Person()    {        cout << "~Person" << endl;    }    void eat()    {        cout << "eat" << endl;    }protected:    string m_strName;};class Worker : virtual public Person{public:    Worker(string name):Person(name)    {        cout << "Worker" << endl;    }    ~Worker()    {        cout << "~Worker" << endl;    }    void work()    {        cout << "work" << endl;    }};class Children : virtual public Person{public:    Children(int age,string name):m_iAge(age),Person(name)    {        cout << "Children" << endl;    }    ~Children()    {        cout << "~Children" << endl;    }    void play()    {        cout << m_iAge << endl;        cout << "play" << endl;    }protected:    int m_iAge;};class ChildLabourer :public Worker,public Children{public:    ChildLabourer(string name, int age) :Worker(name),Children(age,name)    {        cout << "ChildLabourer" << endl;    }        ~ChildLabourer()    {        cout << "~ChildLabourer" << endl;    }};int main(void){    // 用new关键字实例化童工类对象    ChildLabourer *p = new ChildLabourer("jack",12);        // 调用童工类对象各方法。    p->eat();    p->work();    p->play();    delete p;    p = NULL;    system("pause");    return 0;}
查看完整描述

3 回答

已采纳
?
snowmanJS

TA贡献89条经验 获得超53个赞

在childlabourer类的构造函数中的初始化列表中加上Person(name)就行了。

查看完整回答
3 反对 回复 2017-08-23
  • MOCKINGT
    MOCKINGT
    谢谢、可以告诉我为什么吗?
  • snowmanJS
    snowmanJS
    因为Person类要先于其三个子类初始化,即其构造函数是最先执行的。又因为Person没有默认构造函数,但有构造函数Person(string name),所以必须在childlabourer的初始化列表中加上Person (name)。
?
onemoo

TA贡献883条经验 获得超454个赞

刚看到你采纳了我在其他问题中的回答,就顺手点进来了。

你采纳的那个答案回答得很正确,我稍微进行一下补充:

一般来说,派生类只需要负责构造其直接基类,因为间接基类会由直接基类负责构造。但虚继承下有些特殊:最后的派生类要负责构造虚基类(即便是间接虚基类)。或者说,虚基类的构造会优先于普通基类,所以必须由最后的派生类来负责先构造。

如若不然的话你想想会发生什么?  多个被虚基类派生的直接基类会重复构造虚基类部分,为避免发生这种情况才有这个额外规则。


你的例子,虽然 Worker 和 Children 都会构造 Person,但由于 Person 是 ChildLabourer 的虚基类,所以 ChildLabourer 必须先显式构造 Person。如果没有显式构造它,则会自动调用 Person 的默认构造函数。

查看完整回答
1 反对 回复 2017-09-16
?
天将明96

TA贡献15条经验 获得超13个赞

因为童工类继承工人类和儿童类,属于多重继承。所在Person类,Worker类,Children类的构造函数都要加上virtual,这样才可以实现虚继承!

查看完整回答
反对 回复 2017-08-23
点击展开后面2
  • 3 回答
  • 0 关注
  • 1979 浏览

添加回答

举报

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