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

#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;
}



MOCKINGT
浏览 1985回答 3
3回答

snowmanJS

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

onemoo

刚看到你采纳了我在其他问题中的回答,就顺手点进来了。你采纳的那个答案回答得很正确,我稍微进行一下补充:一般来说,派生类只需要负责构造其直接基类,因为间接基类会由直接基类负责构造。但虚继承下有些特殊:最后的派生类要负责构造虚基类(即便是间接虚基类)。或者说,虚基类的构造会优先于普通基类,所以必须由最后的派生类来负责先构造。如若不然的话你想想会发生什么?  多个被虚基类派生的直接基类会重复构造虚基类部分,为避免发生这种情况才有这个额外规则。你的例子,虽然 Worker 和 Children 都会构造 Person,但由于 Person 是 ChildLabourer 的虚基类,所以 ChildLabourer 必须先显式构造 Person。如果没有显式构造它,则会自动调用 Person 的默认构造函数。

天将明96

因为童工类继承工人类和儿童类,属于多重继承。所在Person类,Worker类,Children类的构造函数都要加上virtual,这样才可以实现虚继承!
打开App,查看更多内容
随时随地看视频慕课网APP