赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员,而且所有成员的访问控制属性也和基类完全相同。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。赋值兼容规则中所指的替代包括以下的情况:
    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

c++ 公有继承的赋值兼容规则相关推荐

  1. 继承和多态 1.0 -- 继承概念(is-a、has-a,赋值兼容规则,隐藏重定义)

    普通继承和访问权限 当一个继承没有虚拟继承或者是多重继承时,就是一个简单的继承的时候,这个时候就是一个普通的继承. 普通继承的内存空间是:子类的对象中,包含了父类的成员变量,同时也可以调用父类的成员函 ...

  2. 21(6). 赋值兼容规则与抽象类

    赋值兼容规则(基类和派生类对象赋值转换) 1.派生类对象直接赋值给基类对象 2.派生类对象的地址可以直接给基类对象的指针赋值 3.派生类对象直接赋值给基类的引用对象赋值 //覆盖(重写) class ...

  3. C++继承中父类和子类之间的赋值兼容

    文章目录 1 C++继承中父类和子类之间的赋值兼容 1.1 父子间的赋值兼容 1.2 特殊的同名函数 1 C++继承中父类和子类之间的赋值兼容 1.1 父子间的赋值兼容 在公有继承的条件下,子类对象可 ...

  4. 8-2:C++继承之父类和子类对象赋值转换(公有继承)也即切片

    父类和子类对象赋值转换(公有继承) - - - 父类和子类对象赋值转换是指:子类对象可以赋值给父类对象(父类的指针或引用也可以),而父类对象不能赋值给子类对象.也就Student一定是Person,但 ...

  5. C++ 论公有继承时纯虚函数、虚函数、普通函数的行为表现及虚函数的重写(深度好文)

    文章目录 1 公有继承时三种类型的函数行为 1.1 纯虚函数 (pure virtual) 1.2 普通虚函数 **1.2.1 方法一** **1.2.2 方法二** 1.3 非虚函数 2 重写 (o ...

  6. 关于C++中公有继承、私有继承、保护继承的讨论

    一.文章来由 简单明了的理由,老生常谈但是没真正解决的问题,想搞清楚这个问题. 二.冗长的定义 我们先来看看这些冗长的定义: 公有继承: 当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性 ...

  7. C++ 类继承:构造函数与析构函数调用顺序,派生类和基类之间的特殊关系,公有继承及其他

    文章目录 一.派生类构造函数与基类构造函数 二.创建与销毁派生类对象时,构造函数和析构函数的调用 三.派生类和基类之间的特殊关系 四.公有继承 (一).何为公有继承 (二).多态公有继承 (三).虚函 ...

  8. 头歌 C++ 面向对象程序设计 实验四 公有继承 —— 学生信息类

    设计一个学生信息类 一.任务描述 本关任务:声明并定义一个学生信息类. 二.相关知识 为了完成本关任务,你需要掌握类的声明和定义. 类 在现实世界中,经常有属于同一类的对象.例如,你的自行车只是世界上 ...

  9. python中的继承有什么特点_python类的继承是什么?类的继承有什么样的规则?

    在这篇文章之中我们来了解一下python类的继承,对于刚刚接触到python这一编程语言的朋友来说,对于python类的继承的了解应该比较少,不过没关系,在接下来的文章之中我们就来了解一下python ...

最新文章

  1. 几行代码轻松实现,Tensorlayer 2.0推出深度强化学习基准库
  2. Android Studio如何用真机调试
  3. 神经网络隐藏层节点数效率最优值
  4. 成功解决ValueError: Parameter values for parameter (max_depth) need to be a sequence.
  5. 【数据结构-排序】4.图解归并排序和基数排序
  6. Windows之Wireshake之抓HTTP请求包(过滤目的IP)
  7. php数组去交集,PHP获得数组交集与差集的方法
  8. 输入一个浮点数,并输出该数的整数部分和小数部分
  9. 华为手机如何调时间显示_华为手机不亮屏也能显示时间日期?10秒就能设置,原来这么简单...
  10. 微信授权 php josn,php怎么获取微信多客服json数据
  11. linux单引号、双引号、特殊字符、换行符等用法
  12. 【其他】vue项目集成富文本编辑器
  13. 网页直接加QQ群/QQ好友
  14. 关于win10声卡驱动正常 插入耳机小喇叭显示红叉号 且检测提示未插入耳机的问题
  15. IDEA左侧目录,按照文件夹排序
  16. 下载chromium for Android
  17. Codeforces Gym 100015B Ball Painting 找规律
  18. DSPE-PEG-MAL,474922-22-0,DSPE-PEG-Maleimide
  19. 用项目管理思维做一个活动策划
  20. 论文阅读《API2Com: On the Improvement of Automatically Generated Code Comments Using API Documentations》

热门文章

  1. python image 转成字节_(推荐)谈谈Python生态圈图像格式转换问题:含实例解析
  2. Javaweb 第15天 web练习和分页技术
  3. Android java判断字符串包含某个字符段(或替换)
  4. [ASP.NET] Session的了解
  5. arm指令中mov和ldr及ldr伪指令的区别
  6. java.lang.NoSuchMethodError: org.springframework.beans.factory.annotation.InjectionMetadata.init(L
  7. Windows Mobile 技术开发黄金周系列课程
  8. HOG:从理论到OpenCV实践
  9. 基于HTTP Live Streaming(HLS) 搭建在线点播系统
  10. django-全文检索