C++:多态公有继承
2016-09-07 11:43
239 查看
C++:多态公有继承
标签(空格分隔): c++版本:2 作者:陈小默 声明:禁止商业,禁止转载
本文章仅发布于 作业部落(原) , CSDN
C多态公有继承
派生类可以增加新成员
派生类重写基类的方法
重写方法声明virtual关键字
基类声明virtual的析构函数
为了需要虚拟析构函数
如果我们希望同一个方法在基类和派生类中的行为是不同的的时候,我们可以采取一种比较复杂的行为——多态。具有多态性质的对象的行为取决于调用对象,即同一个方法的行为随上下文而异。为了实现多态C++提供了两种重要的机制1
在派生类中重新定义基类的方法。
使用虚方法
派生类可以增加新成员
无论我们是否使用多态,都可以在派生类中新增成员派生类重写基类的方法
当派生类重写了基类的方式时,该方法就已经具有了不同的行为,当我们使用派生类对象的引用去调用重写后的方法时,就可以看到与父类不同的行为了。但是我们需要注意的一点时,如果我们要在重写的方法中使用父类的同名方法,则必须要使用函数限定名指定方法所在。不然像下面这种情况就会导致StackOverFlowvoid 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++[语法]公有继承和多态
- C++学习-----------------类继承之公有继承
- C++的继承与多态demo
- c++继承与多态
- c++ 多态,继承的代价
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- C++中有私有继承和公有继承之分
- 第05章 CORE C++_对象的创建和使用_继承_多态_析构_xxx_cast_友元_只读成员_静态成员_多重继承_虚继承_内部类
- C++的公有继承
- MSN上关于C++多重继承和多态的聊天记录
- C++多重继承的多态 - Thunk
- 深入剖析C++继承,多态以及隐藏(二)。(纯虚函数以及重写与隐藏)
- C++智能指针与类继承多态
- 深入剖析C++继承,多态以及隐藏(三)(类层次中的转化问题)
- 多态公有继承(虚函数)