加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:43:00 所属栏目:百科 来源:网络整理
导读:h1 class="postTitle" span style="font-size: 18pt;"?C++中的类继承之单继承多继承菱形继承 div class="postBody" div id="cnblogs_post_body" 单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承。这种关系比较简单是一对一的关

<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 }

菱形虚拟继承的对象模型

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读