【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.         或通过对象访问    对象名 . 成员
相关文章
|
18天前
|
编译器 C++ 开发者
【C++】继承
C++中的继承是面向对象编程的核心特性之一,允许派生类继承基类的属性和方法,实现代码复用和类的层次结构。继承有三种类型:公有、私有和受保护继承,每种类型决定了派生类如何访问基类成员。此外,继承还涉及构造函数、析构函数、拷贝构造函数和赋值运算符的调用规则,以及解决多继承带来的二义性和数据冗余问题的虚拟继承。在设计类时,应谨慎选择继承和组合,以降低耦合度并提高代码的可维护性。
28 1
【C++】继承
|
2月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
55 1
|
2月前
|
C++
C++番外篇——虚拟继承解决数据冗余和二义性的原理
C++番外篇——虚拟继承解决数据冗余和二义性的原理
42 1
|
2月前
|
安全 编译器 程序员
C++的忠实粉丝-继承的热情(1)
C++的忠实粉丝-继承的热情(1)
20 0
|
2月前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
32 0
|
2月前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
35 0
|
16天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
27 2
|
22天前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
55 5
|
28天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
59 4
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
71 4