多重继承与虚继承
创始人
2025-05-28 22:18:20
0

菱形继承

例如:现在有五个类:人(Person),学生(Student),研究生(GStudent),职工(Employee),在职研究生(EGStudent)

#include
using namespace std;
#include//人
class Person 
{
private:int id;
public:Person(int pid) :id(pid) { cout << "create Person" << endl; }~Person() { cout << "destory Person" << endl; }
};//学生
class Student : public Person
{
private:int s_num;
public:Student(int pid, int sn) :Person(pid), s_num(sn) { cout << "create Student" << endl; }~Student() { cout << "destory Student" << endl; }
};//研究生
class GStudent : public Student
{
private:int g_num;
public:GStudent(int pid, int sn, int gn) :Student(pid, sn), g_num(gn) { cout << "create GStudent" << endl; }~GStudent() { cout << "destory GStudent" << endl; }
};//职工
class Employee : public Person
{
private:int e_num;
public:Employee(int pid, int en) :Person(pid), e_num(en) { cout << "create Employee" << endl; }~Employee() { cout << "destory Employee" << endl; }
};//在职研究生
class EGStudent : public Employee,public GStudent
{
private:int egs_num;
public:EGStudent(int spid,int epid, int en, int gn, int sn, int egn) :Employee(epid, en), GStudent(spid, sn, gn), egs_num(egn) {    cout << "create EGStudent" << endl;    }~EGStudent() { cout << "destory EGStudent" << endl; }
};int main()
{EGStudent egs(1, 2, 3, 4, 5, 6);return 0;
}

我们可以看到在职研究生对象egs共有3个成员属性

我们运行一下:

我们发现研究生对象egs是一个人,但却有两个身份证id,显然在语义层面是错误的。

这种问题我们一般称为数据冗余与二义性问题,为了解决这样的问题,我们引入了虚继承的概念。

虚继承

虚继承构造函数的调用顺序:

首先调用虚基类的构造函数(虚基类只会构建一次)

其次调用继承类的基类的构造函数

再调用继承类的构造函数

最后调用自己类的构造函数

我们将上述代码改为虚继承Person的方式:

#include
using namespace std;
#include//人
class Person 
{
private:int id;
public:Person(int pid) :id(pid) { cout << "create Person" << endl; }~Person() { cout << "destory Person" << endl; }
};//学生
class Student : virtual public Person
{
private:int s_num;
public:Student(int pid , int sn) :Person(pid), s_num(sn) { cout << "create Student" << endl; }~Student() { cout << "destory Student" << endl; }
};//研究生
class GStudent : public Student
{
private:int g_num;
public:GStudent(int pid, int sn, int gn) :Person(pid),Student(pid,sn), g_num(gn) { cout << "create GStudent" << endl; }~GStudent() { cout << "destory GStudent" << endl; }
};//职工
class Employee : virtual public Person
{
private:int e_num;
public:Employee(int pid, int en) :Person(pid), e_num(en) { cout << "create Employee" << endl; }~Employee() { cout << "destory Employee" << endl; }
};//研究生职工
class EGStudent : public Employee,public GStudent
{
private:int egs_num;
public:EGStudent(int epid,int spid,int en, int gn, int sn, int egn) :Person(epid),Employee(epid,en), GStudent(epid, sn, gn), egs_num(egn) {    cout << "create EGStudent" << endl;    }~EGStudent() { cout << "destory EGStudent" << endl; }
};int main()
{EGStudent egs(1, 2, 3, 4, 5, 6);return 0;
}

我们此时可以看到在职研究生的属性成员变为了4个

我们运行一下:

我们将egs对象中Person属性的id改为10,再看一下

我们此时发现所有继承了Person类的成员属性中的Person是同一份

其原理:

我们将Person定义为虚基类后,编译器会将Person的空间放在此类对象空间的最底部,而其他继承Person的类中原本是存放Person属性成员,现在改为了距离Person类所在空间的偏移量。此时所有继承Person的类共用同一Person,解决了数据冗余与二义性问题。

多重继承中常问的问题

①:请问D类对象的大小?

我们之前学过,空类的大小为1,存在一个占位符

占位符不会被继承,且占位符不算在类的空间大小中

因此D对象的大小为1

②:请问D类对象的大小?

因为虚继承后B和C类需要有一个存放A类偏移量(整形)的空间

且占位符不算在类的空间大小中

因此D的大小为8

相关内容

热门资讯

员工培训满意度调查问卷 员工培训满意度调查问卷员工满意度调查表范例 打印本文  发送邮件给朋友请填写您隶属的部门:1 我很明...
优秀青年志愿者个人事迹材料 优秀青年志愿者个人事迹材料范文(通用8篇)  在我们平凡的日常里,大家都写过事迹材料,肯定对各类事迹...
开展消防安全检查的简报 开展消防安全检查的简报(精选7篇)  在日常学习、工作抑或是生活中,人们运用到简报的场合不断增多,简...
2021党员思想汇报 2021党员思想汇报  一、思想汇报的主要内容  对党的性质、纲领和路线、方针、政策的认识;  学习...
党员民主评议个人评价 党员民主评议个人评价  一、自我评价的积极作用  自我评价是人的自我概念的重要内容之一。其前提是自我...
预备党员转正评语 预备党员转正评语  如何做好预备党员的转正工作  根据党章规定的精神.做好预备党员的转正工作要注意把...
请党放心强国有我主题征文10... 请党放心强国有我主题征文1000字  请党放心强国有我主题征文1000字(精选10篇)  踏上新征程...
在公司上班员工证明 在公司上班员工证明  一、工作证明的含义  工作证明是指我国公民在日常生产生活经营活动中的一种证明文...
网络主播的聊天技巧 网络主播的聊天技巧  在视频直播间里面好多网络主播都不敢开口讲话,怕说多,怕说错,其实学会说话聊天技...
最美孝心少年事迹材料简介 最美孝心少年事迹材料简介最美孝心少年事迹材料简介1  冯xx,男,汉族,现年13岁,20xx年xx月...
青年文明号事迹材料 青年文明号事迹材料范文(精选7篇)  在日常学习、工作和生活中,要用到事迹的地方还是很多的,事迹具有...
初中数学名师工作室个人研修工... 初中数学名师工作室个人研修工作小结  初中数学名师工作室个人研修工作小结  新世纪学校· 龙小枝  ...
幼儿园教育叙事故事 幼儿园教育叙事故事  幼儿园教育叙事故事(一)  让感谢成为习惯  我在幼儿园担任小班教师,第一个活...
怎样做好学生工作 怎样做好学生工作怎样做好学生工作作为学生干部,他被推举学校或系领导同意后任命,授予了一定的权力,但他...
农村经典母亲祭文 农村经典母亲祭文范文(通用6篇)  祭文,文体名。 祭祀或祭奠时表示哀悼或祷祝的文章。 体裁有韵文和...
建党百年句子 建党百年句子  一、中国共产党建党日  中国共产党于1921年7月23日成立后,在反动军阀政府的残暴...
学史增信心得体会 学史增信心得体会  一、什么是党史  中共党史是政党史,是专史,它研究建国后中国共产党作为执政党的历...
优秀团干部简要事迹材料 优秀团干部简要事迹材料  事迹材料是指党政军机关为了弘扬正气,表彰先进,推动工作,对本单位具有突出事...
建党一百周年绘画作品 建党一百周年绘画作品  一、建党一百周年关于党的历史简介  中国共产党创建于1921年,中国共产党破...
安全生产知识培训的内容 安全生产知识培训的内容  安全生产是安全与生产的统一,其宗旨是安全促进生产,生产必须安全。以下是小编...