C++:多态公有继承
来源:互联网 发布:支持java的web服务器 编辑:程序博客网 时间:2024/04/28 00:41
C++:多态公有继承
标签(空格分隔): c++
版本:2作者:陈小默声明:禁止商业,禁止转载
本文章仅发布于 作业部落(原) , CSDN
- C多态公有继承
- 派生类可以增加新成员
- 派生类重写基类的方法
- 重写方法声明virtual关键字
- 基类声明virtual的析构函数
- 为了需要虚拟析构函数
如果我们希望同一个方法在基类和派生类中的行为是不同的的时候,我们可以采取一种比较复杂的行为——多态。具有多态性质的对象的行为取决于调用对象,即同一个方法的行为随上下文而异。为了实现多态C++提供了两种重要的机制1
- 在派生类中重新定义基类的方法。
- 使用虚方法
派生类可以增加新成员
无论我们是否使用多态,都可以在派生类中新增成员
派生类重写基类的方法
当派生类重写了基类的方式时,该方法就已经具有了不同的行为,当我们使用派生类对象的引用去调用重写后的方法时,就可以看到与父类不同的行为了。但是我们需要注意的一点时,如果我们要在重写的方法中使用父类的同名方法,则必须要使用函数限定名指定方法所在。不然像下面这种情况就会导致StackOverFlow
void Dog::bark(){ bark();//correct is Animals::bark();}
重写方法声明virtual关键字
加入我们需要在某些函数上使用多态性质,则需要在基类和派生类的相应方法上声明virtual关键字。假如我们没有声明virtual关键字,则方法的行为与引用类型相关,而与具体的对象无关。也就是说在没有声明virtual的情况下,基类指针一定会调用基类定义的方法,尽管基类指针可能会指向派生类对象。而定义了virtual关键字后,函数的调用就与指针类型无关,而是与对象相关,就算当前指针是基类类型,也会调用对象重写过的方法。
不添加virtual的示例
class Base{public: show(){cout<<"base"<<endl;}; ...}class Imp : Base{public: show(){cout<<"Imp"<<endl;}; ...}...int main(){ Base base = Imp(); base.show();}
输出结果
base
添加virtual的示例
class Base{public: virtual show(){cout<<"base"<<endl;}; ...};class Imp : Base{public: virtual show(){cout<<"Imp"<<endl;}; ...};...int main(){ Base base = Imp(); base.show();}
输出结果
Imp
基类声明virtual的析构函数
class Base{public: virtual ~Base();};
基类对象声明虚拟的析构函数是为了保证释放派生对象时能够按照正确的顺序调用析构函数。
为了需要虚拟析构函数
当我们使用多态性质的时候,大部分都会使用基类指针指向派生类对象。所以原因跟使用虚方法的原因类似。当我们没有声明虚析构函数的时候,delete时只会调用位于指针类型的析构函数。如果我们声明了虚的析构函数,则会调用相应对象类型的虚构函数,而后自动调用基类的析构函数。因此在基类声明虚拟析构函数可以保证析构函数的正确调用顺序。
- Stephen Prata.C++ Primer Plus.人民邮电出版社.2016.3. 490~501 ↩
- C++:多态公有继承
- C++[语法]公有继承和多态
- 多态公有继承
- 多态公有继承
- 类继承,公有继承,多态公有继承
- C++多态公有继承
- C++:公有继承
- C/C++:public公有继承
- c++:私有继承,公有继承,保护继承
- 多态公有继承(虚函数)
- 多态公有继承(虚方法)
- (一三八)多态公有继承
- 多态公有继承的实现
- 公有继承或者公有多继承是可以用::符号
- C++:公有继承、私有继承和保护继承
- 【面向对象】多态公有继承、抽象基类
- C++多态公有继承的一个例子
- 公有继承
- 遍历读取某个文件夹下所有视频
- Android Volley完全解析(二),初识Volley的基本用法
- 记录学习的点滴(Java基础知识)
- jquery 新建的元素事件绑定问题
- 374. Guess Number Higher or Lower
- C++:多态公有继承
- BZOJ1084: [SCOI2005]最大子矩阵 DP
- iOS基础:NSBundle
- Maven的基本操作下
- MYSQL 5.5不支持字段类型为datetime且默认值为NOW()的建表语句
- 【Mac】Eclipse自动编译环境搭建
- NPAPI插件开发学习:插件中多个dll文件的打包
- WebSocket,我已准备好了!
- Python自省(反射)指南