11-多态与继承(上)
2016-03-24 21:24
288 查看
一.函数重写
*: 在子类中定义与父类中原型同样的函数*: 函数重写仅仅发生在父类与子类之间
class Parent { public: void print() { cout<<"parent"<<endl; } }; class Child:public Parent { public: void print() { cout<<"child"<<endl; } };
说明: print() 就为重写函数
*: 父类中被重写的函数依旧会继承给子类
*: 默认情况下子类重写的函数将隐藏父类中的函数
*:通过作用域分辨符::能够訪问到父类中被隐藏的函数
child.print(); child.Parent::print();
当函数重写遇上赋值兼容性原则
void run() { Child child; Parent* pp = &child; Parent& rp =child; child.print(); pp->print(); rp.print(); }
问题所在:
(1) C++与C同样,是静态编译型语言
(2) 在编译时,编译器自己主动依据指针的类型推断指向的是一个什么样的对象
(3) 所以编译器觉得父类指针指向的是父类对象
(4) 因为程序没有执行。所以不可能知道父类指针指向的详细是父类对象还是子类对象
(5) 从程序安全的角度。编译器如果父类指针仅仅指向父类对象。因此编译的结果为调用父类的成员函数。
void func(Parent* p) { p->print(); }
分析: 在编译这个函数的时候,编译器不可能知道指针P指向什么,可是没有理由报错,于是编译器觉得
最安全的做法是编译到父类的print函数。
二. 多态的本质
依据实际的对象类型决定函数调用语句的详细调用目标
*: 假设父类指针指向的是父类对象,则调用父类中定义的函数
*: 假设父类指针指向的是子类对象,则调用子类中定义的重写函数
多态: 相同的调用语句有多种不同的表现形态
C++中的多态支持
*: C++中通过 virtual keyword对多态进行支持
*: 使用virtual声明的函数被重写后就可以表现出多态性
父类函数中增加virtual
class Parent { public: virtual void print() { cout<<"parent"<<endl; } };
小结:
(1) 函数重写仅仅可能发生在父类与子类之间
(2) virtual keyword是C++中支持多态的唯一方式
(3) 被重写的虚函数就可以表现出多态性
相关文章推荐
- Uva 10891 dp
- HEVC之码率 TEncRateCtrl.h的理解
- 世界是数字的读后感
- ZooKeeper完全分布式集群搭建
- Hello World
- Qt Drag and Drop Puzzle Example 看看看~
- Hibernate事务和并发控制
- JAVA学习笔记05
- GridLayout与TableLayout布局
- PAT 堆栈操作合法性
- Android代码设置Shape,corners,Gradient
- BZOJ 2763 飞行线路
- PDO数据库访问抽象层
- HDU 2018 母牛的故事(递推呀...)
- 恒生校招笔试题
- BZOJ2957 楼房重建
- 基于SpringBoot的通用设备操作接口服务
- for update [of] 语句
- Problem I
- 关于shell的几个不为人知却十分有用的命令分享