一 概述
假如我们不想使用多重继承,又不想在基类中添加多余的接口函数,那么我们还有一种方法,我们可以在儿子类中增加一个函数,这样就不用再父亲类中放置多余的虚函数作为接口.
二 修改说明
- 将父类中的beautiful函数去掉
- 子类中自己添加beautiful,但是父类中没有beautiful接口,使用父类调用时出现了错误,此时使用dynamic_cast将父类转换为子类对象,再调用
三 示例演示及结果输出
3.1 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include<iostream> using namespace std; class father{
public: void smart(){cout<<"父亲很聪明"<<endl;} //virtual void beautiful(){} virtual ~father(){cout<<"析构father"<<endl;} };
class son:public father { public: virtual void beautiful(){cout<<"儿子也很帅"<<endl;} ~son(){cout<<"析构son"<<endl;} }; int main() { father *pf; int choice=0; while(choice<99) { bool quit=false; cout<<"(0)退出(1)父亲(2)儿子:"; cin>>choice; switch(choice) { case 0:quit=true; break; case 1:pf=new father; break; case 2:pf=new son; dynamic_cast<son*>(pf)->beautiful(); pf->smart(); delete pf; break; default:cout<<"请输入从0到2之间的数字。"; } if(quit) { break; } } cout<<"程序结束"<<endl; return 0; }
|
3.2 输出结果
1 2 3 4 5 6 7
| (0)退出(1)父亲(2)儿子:2 儿子也很帅 父亲很聪明 析构son 析构father (0)退出(1)父亲(2)儿子:1 (0)退出(1)父亲(2)儿子:
|
四 说明
- dynamic_cast是RTTI中的一个方法,RTTI是"Runtime Type Information"的缩写,意思是:运行时类型信息。它提供了运行时确定对象类型的方法。它有两个方法,分别是typeid和dynamic_cast
- 要注意一点,在程序中应当尽量少用RTTI,因为RTTI是硬性的通过基类指针转换为派生类指针来达到访问派生类函数的目的,所以它实现的不是多态性
- 本节为了解决每个儿子或者女儿都要在父亲类中放一个做为接口的虚函数,父亲类会变得臃肿不堪这个问题,只在儿子类中添加这个虚函数。但是由于这个虚函数不是在父类中,所以再用基类的指针来调用这个子类的虚函数时不具备多态性的效果
- 因此我们必须将基类指针强制转换为子类指针。这里要用到一个方法——dynamic_cast。dynamic_cast的作用是对不同类之间数据类型进行转换,它可以将一个基类的指针转换成一个派生类的指针