C++赋值兼容原则理解
–赋值兼容原则(派生类对象是基类对象,反之不成立)
–基类指针强制转换成派生类指针
–派生类中重定义基类成员(同名覆盖)
假设, 一个基类 "普通人", 一个派生类 "超人".
1) 赋值兼容原则(派生类对象是基类对象,反之不成立)
超人是人吧, 但不是每个人都是超人.
现在我要找一个普通人来干活.
Man* p = new Man; // OK, p指向了一个普通人对象.
Man* p = new SuperMan; // 也OK, 虽然有些大才小用, 但是超人确实可以胜任普通人的工作.
反过来的话:
SuperMan* sp = new Man; // No, 错误, 我需要一个超人, 普通人无法胜任..
2) 基类指针强制转换成派生类指针.
基类指针不可以直接转换成派生指针.
因为你如果准备让普通人(基类)去做超人(派生类)的工作, 是非常危险的, 所以语法不允许.
但是, 由(1)我们知道超人有可能隐藏在普通人之间的(指针是Man*, 但实际对象是SuperMan).
在你确切知道他实际上是超人的时候, 那么可以使用"强制转化", 让他去做超人的事情.
但是, 如果他真的只是普通人, 那么"强制转换"的后果是不确定的, 很可能会引发运行错误.
Man* p = new SuperMan; // 虽然是Man*, 但实际是SuperMan.
((SuperMan*)p)->Fly(); // "强制转换"之后调用 Fly(飞行)函数.
Man* p = new Man; // 真的只是普通人.
((SuperMan*)p)->Fly(); // 语法可以通过, 但是运行阶段很可能会出现莫名其妙的错误.
(3) 派生类中重定义基类成员
成员函数前加virtual表示虚函数, 意味着派生类可能会有自己的特殊实现.
比如说"看"Look这个动作, 普通人只是用肉眼看, 但是超人用红外线看东西.
class Man{
virtual void Look()
{
// 正常人看的代码.
}
};
class SuperMan: public Man
{
virtual void Look()
{
// 红外线
}
};
SuperMan中的Look前面加不加virtual都可以, 意思不会变.
Man* p = new SuperMan;
p->Look() // 红外线, 虽然用Man*调用函数, 但是由于是虚函数, 会自动定位到SuperMan::Look上。
很有意思的打比方,过目不忘(看过就不会忘)。
转载自:https://blog.csdn.net/cs494208907/article/details/11920971
.
C++赋值兼容原则理解的更多相关文章
- C++赋值兼容原则
C++赋值兼容原则(派生类对象是基类对象,反之不成立) –基类指针强制转换成派生类指针 –派生类中重定义基类成员(同名覆盖) 假设, 一个基类 "普通人", 一个派生类 " ...
- C++虚函数、赋值兼容原则
#include <iostream.h> class A { public: void f1() { cout << "a" << endl; ...
- C++语言笔记系列之十六——赋值兼容规则&多继承的二义性
1.赋值兼容规则 (1)派生类对象能够给基类对象赋值,这样的情况下派生类对象将从基类继承的成员的值赋值给一个基类对象:可是不同意将一个基类的对象赋值给一个派生类. (2)能够将派生类对象的地址赋给基类 ...
- js赋值运算的理解
简介 js引擎由于为了效率,很多时候的非直接量赋值都不是copy一份在赋值给新的变量,而是一个引用 ps:直接量:直接值数字字符串等 为什么使用len = doms.length; 里的len效率要比 ...
- C++:基类与派生类对象之间的赋值兼容关系
4.5 基类与派生类对象之间的赋值兼容关系 在一定条件下,不同类型的数据之间可以进行类型转换,例如可以将整型数据赋给双精度型变量. 在赋值之前,先把整型数据转换为双精度型数据,然后再把它双精度型变量. ...
- 类型兼容原则(C++)
类型兼容原则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代. 通过公有继承,派生类得到了基类中除构造函数.析构函数之外的所有成员.这样,公有派生类实际具备了基类的所有功能,凡是基类能解 ...
- C++中的继承详解(3)作用域与重定义,赋值兼容规则
作用域与同名隐藏 一样的,先上代码 1 class A 2 { 3 public: 4 int a_data; 5 void a() 6 { 7 cout << "A" ...
- C++中的继承(3)作用域与重定义,赋值兼容规则
作用域与重定义(同名隐藏) 一样的,先上代码 1 class A 2 { 3 public: 4 int a_data; 5 void a() 6 { 7 cout << "A& ...
- C++中的继承(3)作用域与重定义,赋值兼容规则
1.作用域与重定义(同名隐藏) 一样的,先上代码 1 class A 2 { 3 public: 4 int a_data; 5 void a() 6 { 7 cout << " ...
随机推荐
- JDK 8 新特性之函数式编程 → Stream API
开心一刻 今天和朋友们去K歌,看着这群年轻人一个个唱的贼嗨,不禁感慨道:年轻真好啊! 想到自己年轻的时候,那也是拿着麦克风不放的人 现在的我没那激情了,只喜欢坐在角落里,默默的听着他们唱,就连旁边的妹 ...
- JS 替换日期的横杠为斜杠
例如1: <script type="text/javascript"> var dt = "2010-01-05"; ...
- Spring Boot 如何快速集成 Redis 哨兵?
上一篇:Spring Boot 如何快速集成 Redis? 前面的分享栈长介绍了如何使用 Spring Boot 快速集成 Redis,上一篇是单机版,也有粉丝留言说有没有 Redis Sentine ...
- Spine学习八 - 幻影特效
Spine支持一些自带的特效,这些特效,不需要在spine中制作,而只是通过在unity中添加一些脚本便可实现. 这里先讲解一个比较使用又酷炫的效果,幻影特效: 1. 首先,在SkeletonAnim ...
- python学习第八天
解析库之bs4的基本使用方法 ''' pip install beautifulsoup4#安装bs4 pip install lxml#安装lxml ''' html_doc = "&qu ...
- 深入了解Kafka【五】Partition和消费者的关系
1.消费者与Partition 以下来自<kafak权威指南>第4章. 假设主题T1有四个分区. 1.1.一个消费者组 1.1.1.消费者数量小于分区数量 只有一个消费者时,消费者1将收到 ...
- linux安装dubbo与zookeeper(一)
所需工具: jdk1_7.tar.gz dubbo-admin-2.5.4.war(此文件不需解压) zookeeper.tar.gz tomcat7.0.tar.gz 以上文件下载需根据自己的电脑系 ...
- 一文搞懂WordPress建站
文章首发于:https://zouwang.vip/ 日日夜夜的等待,WordPress建站教程终于来了.本篇文章适用于第一次建站的小白,帮助你从零搭建起一个属于自己的网站,既然是从零,那么我就会带着 ...
- [oracle/sql]关于清除重复,not in方案和not exists方案的对比
有这样一张表: CREATE TABLE tb_sc ( id NUMBER not null primary key, studentid int not null, courseid int no ...
- 转载:Linux: What’s the difference between a soft link and a hard link?
Link:https://www.moreofless.co.uk/linux-difference-soft-symbolic-link-and-hard-link/ This example sh ...