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

前端之家收集整理的这篇文章主要介绍了C++中的类继承之单继承&多继承&菱形继承前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

<h1 class="postTitle"><span style="font-size: 18pt;"> C++中的类继承之单继承&多继承&菱形继承

<div class="postBody">
<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 Base
10 {
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 A
10 {
11 public:
12     Base() {
13         cout << "B()" << endl;
14     }
15     int b1;
16 };
17 class C:virtual public A
18 { 
19 public:
20     C() {
21         cout << "C()" << endl;
22     }
23     int c;
24 };
25 class Derive : virtual public Base,virtual public C
26 {
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 }
复制代码

菱形虚拟继承的对象模型

解决二义性问题在vs环境下用的是偏移量,而不是图中的直接指针指向这里只是为了更直观的展示。

猜你在找的C#相关文章