多型的繫結可以分為執行是多型和編譯時多型
● 編譯時的多型性
編譯時的多型性是通過過載來實現的。對於非虛的成員來說,系統在編譯時,根據傳遞的引數、返回的型別等資訊決定實現何種操作。
● 執行時的多型性
執行時的多型性就是指直到系統執行時,才根據實際情況決定實現何種操作。c#中,執行時的多型性通過虛成員實現。
編譯時的多型性為我們提供了執行速度快的特點,而執行時的多型性則帶來了高度靈活和抽象的特點。
今天才正式弄清楚原來虛函式是可以實現執行時多型的,以前只知道虛函式可以使得基類物件的的方法呼叫派生類的方法。
2、析構函式是虛函式的優點是什麼
用c++開發的時候,用來做基類的類的析構函式一般都是虛函式。可是,為什麼要這樣做呢?下面用乙個小例子來說明:
有下面的兩個類:
class clxbase ;
virtual ~clxbase() {};
virtual void dosomething() ; };
class clxderived : public clxbase ;
~clxderived() ;
void dosomething() ; };
** clxbase *ptest = new clxderived;
ptest->dosomething();
delete ptest;
輸出結果是:
do something in class clxderived!
output from the destructor of class clxderived!
這個很簡單,非常好理解。
但是,如果把類clxbase析構函式前的virtual去掉,那輸出結果就是下面的樣子了:
do something in class clxderived!
也就是說,類clxderived的析構函式根本沒有被呼叫!一般情況下類的析構函式裡面都是釋放記憶體資源,而析構函式不被呼叫的話就會造成記憶體洩漏。我想所有的c++程式設計師都知道這樣的危險性。當然,如果在析構函式中做了其他工作的話,那你的所有努力也都是白費力氣。
所以,文章開頭的那個問題的答案就是--這樣做是為了當用乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫。
當然,並不是要把所有類的析構函式都寫成虛函式。因為當類裡面有虛函式的時候,編譯器會給類新增乙個虛函式表,裡面來存放虛函式指標,這樣就會增加類的儲存空間。所以,只有當乙個類被用來作為基類的時候,才把析構函式寫成虛函式。
C 多型的實現
封裝 繼承 多型,物件導向的三大特性,前兩項理解相對容易,但要理解多型,特別是深入的了解,對於初學者而言可能就會有一定困難了。我一直認為學習oo的最好方法就是結合實踐,封裝 繼承在實際工作中的應用隨處可見,但多型呢?也許未必,可能不經意間用到也不會把它跟 多型 這個詞對應起來。在此拋磚引玉,大家討論...
C 多型的實現
封裝 繼承 多型,物件導向的三大特性,前兩項理解相對容易,但要理解多型,特別是深入的了解,對於初學者而言可能就會有一定困難了。我一直認為學習oo的最好方法就是結合實踐,封裝 繼承在實際工作中的應用隨處可見,但多型呢?也許未必,可能不經意間用到也不會把它跟 多型 這個詞對應起來。在此拋磚引玉,大家討論...
C 實現多型
多型 就是指不同物件收到相同訊息是,會產生不同行為,同乙個類在不同的場合下表現出不同的行為特徵 多型的作用 把不同的子類物件都當做父類來看,可以遮蔽不同子類物件之間的差異,寫出通用的 做出通用的程式設計,以適應需求的不斷變化。實現多型有三種形式 虛方法抽象類介面 下面,使用虛方法,簡單實現多型效果 ...