【C++】 --- 继承中的构造和析构

简介: 【C++】 --- 继承中的构造和析构

1、类型兼容性原则

类型兼容规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。

类型兼容规则中所指的替代包括以下情况:

1. 子类对象可以当作父类对象使用
2. 
3. 子类对象可以直接赋值给父类对象
4. 
5. 子类对象可以直接初始化父类对象
6. 
7. 父类指针可以直接指向子类对象
8. 
9. 父类引用可以直接引用子类对象

在替代之后,派生类对象就可以作为基类的对象使用,但是只能使用从基类继承的成员。

类型兼容规则是多态性的重要基础之一。

2、继承中的内存模型

1. class A
2. {
3. public:
4. protected:
5.  int x;
6.  int y;
7. private:
8. };
9. 
10. class B:public A
11. {
12. public:
13. protected:
14.   int s;
15. private:
16. };
17. 
18. class C:public B
19. {
20. public:
21. protected:
22.   int h;
23.   int v;
24. private:
25. };
26. 
27. int main()
28. {
29.   A objA;
30.   B objB;
31.   C objC;
32.   cout << "sizeof A: " << sizeof(A) << endl;
33.   cout << "sizeof B: " << sizeof(B) << endl;
34.   cout << "sizeof C: " << sizeof(C) << endl;
35. 
36.   system("pause");
37. 
38.   return 0;
39. }

类B从A类public继承,同时类B自身又增加了一个成员属性s,类C从类B公有继承,同时自身又增加了两个属性h、y。因此继承中的对象模型:

 

3、继承中的构造析构调用原则

1. 1、子类对象在创建时会首先调用父类的构造函数
2. 2、父类构造函数执行结束后,执行子类的构造函数
3. 3、当父类的构造函数有参数时,需要在子类的初始化列表中显示调用
4. 4、析构函数调用的先后顺序与构造函数相反
1. class Parent
2. {
3. public:
4.  Parent(int a, int b )
5.  {
6.    this->a = a;
7.    this->b = b;
8.    cout << "Parent 构造函数" << endl;
9.  }
10. 
11.   ~Parent()
12.   {
13.     cout << "parent 析构函数" << endl;
14.   }
15. private:
16.   int a;
17.   int b;
18. };
19. 
20. class Child:public Parent
21. {
22. public:
23.   Child(int a, int b, int c):Parent(a,b)
24.   {
25.     this->c = c;
26.     cout << "child 构造函数" << endl;
27.   }
28. 
29.   ~Child()
30.   {
31.     cout << "child 析构函数" << endl;
32.   }
33. private:
34.   int c;
35. };
36. 
37. void playobj()
38. {
39.   Child c1(1, 2, 3);
40. 
41. }
42. 
43. int main(void)
44. {
45.   //Parent p(1, 2);
46. 
47.   playobj();
48.   system("pause");
49. }

4、继承中的同名属性和同名方法的处理

1. 1、当子类成员变量与父类成员变量同名时,子类依然从父类继承同名成员
2. 
3. 2、在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员,显式地使用类名限定符)
4. 
5. 3、同名成员存储在内存中的不同位置

5、继承中的static关键字

1. 1、基类定义的静态成员,将被所有派生类共享
2. 2、根据静态成员自身的访问特性和派生类的继承方式,在类层次体系中具有不同的访问性质 (遵守派生类的访问控制)
3. 3、派生类中访问静态成员,用以下形式显式说明:
4.                           类名 :: 成员
5. 
6.         或通过对象访问    对象名 . 成员
相关文章
|
1月前
|
安全 程序员 编译器
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
【C++篇】继承之韵:解构编程奥义,领略面向对象的至高法则
77 11
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
51 1
|
1月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
36 1
|
25天前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
15 0
|
1月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
27 0
|
1月前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
31 0
|
19天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
21 4
|
19天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
18 4
|
19天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
17 1
|
29天前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)