赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员,而且所有成员的访问控制属性也和基类完全相同。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。赋值兼容规则中所指的替代包括以下的情况:
1>派生类的对象可以赋值给基类对象。
2>派生类的对象可以初始化基类的引用。
3>派生类对象的地址可以赋给指向基类的指针。
在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。示例如下:
1 #include "stdafx.h"
2 #include <iostream>
3 using namespace std;
4
5 class birds //基类
6 {
7 public:
8 void Speaking()
9 {
10 cout << "......" << endl;
11 }
12 };
13
14 class owl : public birds //子类
15 {
16 public:
17 void Speaking()
18 {
19 cout << "HOOT! HOOT! " << endl;
20 }
21 };
22
23
24 int main()
25 {
26 birds b0;
27 owl b1;
28 owl b2;
29
30 b0 = b2; //子类的对象可以赋给基类的对象
31 b0.Speaking();
32
33 birds &br = b1; //子类的对象可以初始化基类的引用
34 br.Speaking();
35
36 birds *pt = &b1; //子类的对象的地址可以赋给指向基类的指针
37 pt->Speaking();
38
39 return 0;
40 }
输出结果:
由运行结果可知,当派生类的对象当成基类的对象使用时,调用的都是基类的成员函数和数据成员;
当birds中的Speaking用virtual修饰时,输出结果会是怎样的呢?
1 #include "stdafx.h"
2 #include <iostream>
3 using namespace std;
4
5 class birds //基类
6 {
7 public:
8 virtual void Speaking()
9 {
10 cout << "......" << endl;
11 }
12 };
13
14 class owl : public birds //子类
15 {
16 public:
17 virtual void Speaking()
18 {
19 cout << "HOOT! HOOT! " << endl;
20 }
21 };
22
23
24 int main()
25 {
26 birds b0;
27 owl b1;
28
29 b0 = b1; //子类的对象可以赋给基类的对象
30 b0.Speaking();
31
32 birds &br = b1; //子类的对象可以初始化基类的引用
33 br.Speaking();
34
35 birds *pt = &b1; //子类的对象的地址可以赋给指向基类的指针
36 pt->Speaking();
37
38 return 0;
39 }
输出结果:
注意:
复制兼容规则不适用于基类对象,只适用基类引用和指针。
原文链接: https://www.cnblogs.com/Trojan00/p/8835047.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/272330
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!