C 多型的實現

2021-08-30 22:22:46 字數 1241 閱讀 3495

多型的繫結可以分為執行是多型和編譯時多型

● 編譯時的多型性

編譯時的多型性是通過過載來實現的。對於非虛的成員來說,系統在編譯時,根據傳遞的引數、返回的型別等資訊決定實現何種操作。

● 執行時的多型性

執行時的多型性就是指直到系統執行時,才根據實際情況決定實現何種操作。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 實現多型

多型 就是指不同物件收到相同訊息是,會產生不同行為,同乙個類在不同的場合下表現出不同的行為特徵 多型的作用 把不同的子類物件都當做父類來看,可以遮蔽不同子類物件之間的差異,寫出通用的 做出通用的程式設計,以適應需求的不斷變化。實現多型有三種形式 虛方法抽象類介面 下面,使用虛方法,簡單實現多型效果 ...