首先了解一下實現運行時多態的前提條件:
賦值兼容是動多態能夠產生的前提。所謂賦值兼容顧名思義:不同類型的變量之間互相賦值的兼容現象。就像隱式類型轉換一樣,而對於父子類對象之間的賦值兼容是有嚴格規定的,只有在以下幾種情況下才能賦值兼容:
① 派生類的對象可以賦值給基類對象。
② 派生類的對象可以初始化基類的引用。
③ 派生類對象的地址可以賦給指向基類的指針
但是由於基類對象與基類引用的侷限性,我們一般採用基類指針進行派生類對象的函數調用。
實現條件:
① 父類中有虛函數。
② 子類 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>
圖解:
-End-
閱讀更多 小智雅匯 的文章