- 前言
- 一、菱形继承是什么?
- 二、没有虚继承的情况
- 1.具体代码
- 2.结构图
- 二、有虚继承的情况
- 1.具体代码
- 2.结构图
- 总结
前言
简单介绍一下C++中的菱形继承
提示:以下是本篇文章正文内容,下面案例可供参考
一、菱形继承是什么?菱形继承:指有一个基类被两个不同的类所继承,且存在一个类继承于这两个类而形成的一种菱形关系,故称菱形继承。如下图所示:
如果Person中含有一个性别属性,在Base中是女,在Test中是男,那么在Stud_Elem中性别这个属性就会产生异议。
代码如下(示例):
class Object { public: Object(int x = 0) :value(x) {} private: int value; }; class Base:public Object { public: Base(int x = 0) :Object(x + 10), num(x) {} private: int num; }; class Test:public Object { public: Test(int x = 0) :Object(x + 10), sum(x) {} private: int sum; }; class Det:public Base,public Test { public: Det(int x = 0) :total(x),Base(x + 10), Test(x + 20) {} private: int total; }; int main() { Det d; return 0; }2.结构图
在Det的内存中存在着两个Object对象,一个是来自base的,一个是来自test的。
代码如下(示例):
class Object { public: Object(int x = 0) :value(x) {} private: int value; }; class Base:virtual public Object { public: Base(int x = 0) :Object(x + 10), num(x) {} private: int num; }; class Test:virtual public Object { public: Test(int x = 0) :Object(x + 10), sum(x) {} private: int sum; }; class Det:public Base,public Test { public: Det(int x = 0) :total(x),Base(x + 10), Test(x + 20),Object(x+100) {} //Object的对象构造只会执行一次,在Base和Test中不再进行构造 private: int total; }; int main() { Det d; return 0; }2.结构图 总结
提示:这里对文章进行总结:
虚继承主要解决菱形继承中属性存在二义性的问题。