–赋值兼容原则(派生类对象是基类对象,反之不成立)
–基类指针强制转换成派生类指针
–派生类中重定义基类成员(同名覆盖)

假设, 一个基类 "普通人", 一个派生类 "超人".

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

.

最新文章

  1. LYDSY模拟赛day1 String Master
  2. (转)小心FPGA的JTAG口(上电和下电顺序)
  3. android 自定义View Caused by: java.lang.ClassNotFoundException: Didn't find class
  4. asp.net 文件 操作方法
  5. ACM/ICPC 之 DP进阶(51Nod-1371(填数字))
  6. [COJ0989]WZJ的数据结构(负十一)
  7. JAVA并发编程的艺术
  8. Swift一些语法
  9. debian创建apt-proxy代理
  10. 【ZOJ2112】【整体二分+树状数组】带修改区间第k大
  11. Event | Beijing Makerspace
  12. Android 蓝牙( Bluetooth)耳机连接分析及实现
  13. cloudflare的新waf,用Lua实现的
  14. Log4j – Configuring Log4j 2 - Log4j 2的配置
  15. 聚类-K均值
  16. POST请求的提交
  17. Chapter 5 Blood Type——19
  18. 鼠标右键打开命令行cmd(管理员身份)
  19. 数据库中关于convert的参数学习(转化函数用法)
  20. Css的前世今生

热门文章

  1. ArcGis中地理数据库(sde)中概念及常见函数
  2. 没想到,Git居然有3种“后悔药”!
  3. MinGW-w64安装过程中出现ERROR res错误的问题
  4. Mono嵌入C++
  5. Java 与 Mysql连接,并分页显示
  6. Kubernetes-5:搭建企业级私有仓库Harbor
  7. jni之jni与jna的比较
  8. [Liunx]apt-get安装软件:依赖冲突问题及解决
  9. JVM初认识
  10. 解析nohup java -jar xxx &