#includeusing namespace std;
/***************多型起作用的地方****
1)通過指標呼叫虛函式
2)通過引用呼叫虛函式
3)通過非靜態成員函式,呼叫虛函式,下面用例就是為了驗證這個,在成員函式中有乙個this指標。
****************/
class a
void test1()
virtual void test2()
void test3()
protected :
int a;
};class b:public a
void test1()//隱藏
virtual void test2()//覆蓋override
//void test3()
//};
int main(int argc,char **ar**)
輸出結果:
--------0--------
constructor a:10
class a:10
class a virtual:10
---------1--------
constructor a:20
class a:20
class a virtual:20
constructor b:20
class b:20
class b virtual:20
---------2--------
class a test3
class a virtual:10
class a test3
class b virtual:20
總結:只有指標或者引用訪問虛函式才會產生多型,而且我們呼叫delete時,也會呼叫this指標指向的析構函式,比如如下**:
class point
~point()
};class circle:public point
~circle()
};int main(void)
輸出:executing point destructor,只呼叫基類的析構函式,也就是this指標的型別是point*,
沒有發生多型,this就是靜態型別。
如果析構函式改為虛函式,則輸出:
executing circle destructor
executing point destructor
可以認為是乙個基類物件的型別呼叫虛函式(析構函式)發生了多型,靜態型別和動態型別不一致了,最終先呼叫派生類的析構函式。
下面有個更有意思的**,雖然析構函式不是虛函式,但由於destroy函式是虛函式,發生了多型,在執行時依據動態型別呼叫,所以此時的this是指向派生類,但具體**如下:
class point
~point()
virtual void destory()
};class circle:public point
~circle()
void destory()
};int main(void)
輸出:circle delete this
executing circle destructor
executing point destructor
C 多型性的理解和舉例
多型性是物件導向程式的乙個重要特徵,下面通過程式來理解程式的多型性 多型性 includeusing namespace std class point float gety const friend ostream operator ostream const point protected fl...
C 的靜態多型性和動態多型性(學習心得 20)
同乙個行為,具有多個不同表現形式或形態的能力。在物件導向程式設計正規化中,多型性往往表現為 乙個介面,多個功能 多型性可以是靜態的或動態的 在 c 中,每個型別都是多型的,因為包括使用者定義型別在內的所有型別都繼承自 object。同乙個事件發生在不同的物件上會產生不同的結果。超級小白友好,講解c ...
c 中虛函式和多型性的問題
我的疑問 的解答 解答一 拿動物為父類,定義乙個走動的函式,魚是游泳,鳥是飛.父類無法具體實現或者說不知道實現哪乙個,將方法virtual後,就沒有具體實現,讓子類自己實現 解答二 虛函式是在基類中定義的,目的是不確定它的派生類的具體行為。例 定義乙個基類 class animal 動物。它的函式為...