C++|一个简单实例和一张图深刻认识虚函数与运行时多态

首先了解一下实现运行时多态的前提条件:

赋值兼容是动多态能够产生的前提。所谓赋值兼容顾名思义:不同类型的变量之间互相赋值的兼容现象。就像隐式类型转换一样,而对于父子类对象之间的赋值兼容是有严格规定的,只有在以下几种情况下才能赋值兼容:

① 派生类的对象可以赋值给基类对象。

② 派生类的对象可以初始化基类的引用。

③ 派生类对象的地址可以赋给指向基类的指针

但是由于基类对象与基类引用的局限性,我们一般采用基类指针进行派生类对象的函数调用。

实现条件:

① 父类中有虚函数。

② 子类 override(覆写/覆盖)父类中的虚函数。

③ 通过己被子类对象赋值的父类指针或引用,调用共用接口。

简单小实例:

#include <iostream>
using namespace std;
class A {
public:
\tA() : m_data1(0), m_data2(0) {}
\tvirtual 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:
\tB() : 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:
\tC() : 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;
\tA aObject;
\tp = &aObject;
\tp->vfunc1();
\tB bObject;
\tp = &bObject;
\tp->vfunc1();
\tC cObject;
\tp = &cObject;
\tp->vfunc1();
\tp->vfunc2();
\tcObject.A::func1();
\taObject = static_cast/<iostream>

图解:

C++|一个简单实例和一张图深刻认识虚函数与运行时多态

-End-


分享到:


相關文章: