C++中的类继承之单继承&多继承&菱形继承

C++中的类继承之单继承&多继承&菱形继承,第1张

概述C++中的类继承之单继承&多继承&菱形继承 单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承。这种关系比较简单是一对一的关系: 多继承是指 一个子类有两个或以

<h1 ><span > C++中的类继承之单继承&多继承&菱形继承

<div >
<div ID="cnblogs_post_body">

单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承。这种关系比较简单是一对一的关系:

多继承是指 一个子类有两个或以上直接父类时称这个继承关系为多继承。这种继承方式使一个子类可以继承多个父类的特性。多继承可以看作是单继承的扩展。具有多个基类,与每个基类之间的关系仍可看作是一个单继承。多继承下派生类的构造函数与单继承下派生类构造函数相似,它必须同时负责该派生类所有基类构造函数的调用。同时,派生类的参数个数必须包含完成所有基类初始化所需的参数个数。在子类的内存中它们是按照声明定义的顺序存放的,下面的截图将清晰看到。

class Base{public:Base() {cout << "B()" << endl;}int b1;};class Derive : public Base{public:Derive() {cout << "D()" << endl;}int d1; };int main(){test();getchar();return 0;}

多继承的内存空间:

class Base{public:Base() {cout << "B()" << endl;}int b1;};class C{public:C() {cout << "C()" << endl;}int c;};class Derive : public Base,public C{public:Derive() {cout << "D()" << endl;}int d1; };

菱形继承内存中数据分布:

class A{public:A() {cout << "A()" << endl;}int a;};class Base:public A{public:Base() {cout << "B()" << endl;}int b1;};class C: public A{public:C() {cout << "C()" << endl;}int c;};class Derive : public Base,public C{public:Derive() {cout << "D()" << endl;}int d1; };1 tmp.C::a=4;2 tmp.Base::a=5;什么是对象模型

有两个概念可以解释C++对象模型:

1、语言中直接支持面向对象程序设计的部分。2、对于各种支持的底层实现机制。

还有另外一个方法解决这个问题,我们要用到一种新的继承方法:虚继承--解决菱形继承的二义性和数据冗余的问题。看下面这段代码:

 1 class Base 2 { 3 public: 4     Base() { 5         cout << "B()" << endl; 6     } 7     int b1; 8 }; 9 class Derive : virtual public Base10 {11 public:12     Derive() {13         cout << "D()" << endl;14     }15     int d1; 16 };17 voID test()18 {19     Derive tmp;20     tmp.d1 = 1;21     tmp.b1 = 2;23 }24 int main()25 {26     test();27     getchar();28     return 0;29 }

虚拟继承的关键字---virtual

 1 class A 2 { 3 public: 4     A() { 5         cout << "A()" << endl; 6     } 7     int a ; 8 }; 9 class Base : virtual public A10 {11 public:12     Base() {13         cout << "B()" << endl;14     }15     int b1;16 };17 class C:virtual public A18 { 19 public:20     C() {21         cout << "C()" << endl;22     }23     int c;24 };25 class Derive : virtual public Base,virtual public C26 {27 public:28     Derive() {29         cout << "D()" << endl;30     }31     int d1; 32 };33 voID test()34 {35     Derive tmp;36     tmp.d1 = 1;37     tmp.b1 = 2;38     tmp.c = 3;39     tmp.a = 4;40 }41 int main()42 {43     test();44     getchar();45     return 0;46 }

菱形虚拟继承的对象模型

总结

以上是内存溢出为你收集整理的C++中的类继承之单继承&多继承&菱形继承全部内容,希望文章能够帮你解决C++中的类继承之单继承&多继承&菱形继承所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1264143.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存