1、通过一个隐式转换,从派生类指针或引用转换到其公有基类的指针或引用。
Query *pquery = new NameQuery("Glass");
2、通过虚拟函数机制:
pquery-eval();
3、通过dynamic_cast和typeid操作符
if( NameQuery *pnq = dynamic_cast <NameQuery *>(pquery)) ....
在MFC中,通过某个基类的调用,通过定义基类对象,或者直接调用函数(通过this指针)来
实现多态的性质。如OnMsgCmd函数,当调用进入的this指针的更改后,OnMsgCmd的
调用主也发生相应的改变。
上面是在学习深入浅出MFC时学习的。后来又看了C++ Primer,设计模式等书籍,对于虚拟多态的理解更多了一些:
C++中通过虚拟函数列表实现虚拟函数,是OOP最为重要的方向,vptr指针数组是编译器自己加上去的,派生类继承基类的时候,vptr指针也是被继承存在与派生类中,当派生类中将虚拟函数重新定义后,vptr指针数组中相关函数地址值也修改为重新定义后的指针,这与override功能类似。
通过基类指针,调用虚拟函数时,在编译器内部可以转换为调用通过vptr指针调用函数,而vptr指针数组是基类与派生类同时存在的,因此派生类的虚拟函数就可以被正确调用了。
关于这方面的文章,csdn中已经有不少了:
http://blog.csdn.net/x_j_best/archive/2007/12/19/1954308.aspx (有详尽的虚拟函数表说明)
http://blog.csdn.net/darongtou/archive/2007/12/15/1937882.aspx (不将析构函数声明为虚拟函数的问题介绍)
http://blog.csdn.net/hong_sea/archive/2007/12/06/1920022.aspx (这里面也有一些介绍)
通过公有继承的派生类函数,可以将基类的private属性的函数,转变为public属性的函数,改变访问属性。
当一个类的析构函数被声明为虚拟函数或者成员函数中有纯虚拟函数时,表明该类为基类,需要在派生类中重新定义,一般情况下,析构函数被声明为纯虚拟函数更为妥当,其它函数可以有一个空定义,这样可以减少派生类的工作量,而又不失基类为abstract类。