#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 回答
onemoo
TA贡献883条经验 获得超454个赞
刚看到你采纳了我在其他问题中的回答,就顺手点进来了。
你采纳的那个答案回答得很正确,我稍微进行一下补充:
一般来说,派生类只需要负责构造其直接基类,因为间接基类会由直接基类负责构造。但虚继承下有些特殊:最后的派生类要负责构造虚基类(即便是间接虚基类)。或者说,虚基类的构造会优先于普通基类,所以必须由最后的派生类来负责先构造。
如若不然的话你想想会发生什么? 多个被虚基类派生的直接基类会重复构造虚基类部分,为避免发生这种情况才有这个额外规则。
你的例子,虽然 Worker 和 Children 都会构造 Person,但由于 Person 是 ChildLabourer 的虚基类,所以 ChildLabourer 必须先显式构造 Person。如果没有显式构造它,则会自动调用 Person 的默认构造函数。
天将明96
TA贡献15条经验 获得超13个赞
因为童工类继承工人类和儿童类,属于多重继承。所在Person类,Worker类,Children类的构造函数都要加上virtual,这样才可以实现虚继承!
- 3 回答
- 0 关注
- 2035 浏览
添加回答
举报
0/150
提交
取消