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-


分享到:


相關文章: