首先了解一下实现运行时多态的前提条件:
赋值兼容是动多态能够产生的前提。所谓赋值兼容顾名思义:不同类型的变量之间互相赋值的兼容现象。就像隐式类型转换一样,而对于父子类对象之间的赋值兼容是有严格规定的,只有在以下几种情况下才能赋值兼容:
① 派生类的对象可以赋值给基类对象。
② 派生类的对象可以初始化基类的引用。
③ 派生类对象的地址可以赋给指向基类的指针
但是由于基类对象与基类引用的局限性,我们一般采用基类指针进行派生类对象的函数调用。
实现条件:
① 父类中有虚函数。
② 子类 override(覆写/覆盖)父类中的虚函数。
③ 通过己被子类对象赋值的父类指针或引用,调用共用接口。
简单小实例:
#include using namespace std;class A {public:A() : m_data1(0), m_data2(0) {}virtual void vfunc1() { cout << "A::vfunc1" << endl; }; virtual void vfunc2() { cout << "A::vfunc2" << endl; }; void func1() { cout << "A::func1" << endl; }; void func2() { cout << "A::func2" << endl; };private: int m_data1, m_data2;};class B : public A {public:B() : A(), m_data3(0) {} virtual void vfunc1() { cout << "B::vfunc1" << endl; }; void func1() { cout << "B::func1" << endl; };private: int m_data3;};class C: public B {public:C() : B(), m_data1(0), m_data4(0) {} virtual void vfunc2() { cout << "C::vfunc2" << endl; }; void func2() { cout << "C::func2" << endl; };private: int m_data1, m_data4;};int main(){ A *p;A aObject;p = &aObject;p->vfunc1();B bObject;p = &bObject;p->vfunc1();C cObject;p = &cObject;p->vfunc1();p->vfunc2();cObject.A::func1();aObject = static_cast(bObject);//在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;//在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。aObject.vfunc1();/*B* bp = &bObject;C* cp = &cObject;cp = static_cast(bp);//在类层次间进行上行转换(指针)时,dynamic_cast和static_cast的效果是一样的;//在进行下行转换(指针)时,dynamic_cast具有类型检查的功能,比static_cast更安全。cp->vfunc1(); //B::vfunc1dynamic_cast(bp);cp->vfunc1(); //B::vfunc1*/system("pause");return 0;}/*A::vfunc1B::vfunc1B::vfunc1C::vfunc2A::func1A::vfunc1*/
图解:
![bb7469545351e96644b75324b8bfcef5.png](https://i-blog.csdnimg.cn/blog_migrate/e5dc5a7a65fcbdf2ed632aeb6986241f.jpeg)
-End-