c 為什麼需要把重新定義的函式定義為虛擬函式

時間 2021-08-30 10:08:09

1樓:聚發稿網

1不是不能定義,是定義了沒意義。因為建構函式不被繼承,而虛擬函式是要在派生類中重定義的2定義虛解構函式後,由於多型,當使用基類指標指向派生類物件時,會呼叫派生類的虛構函式,然後派生類的解構函式自動呼叫基本解構函式。不是虛的話,直接呼叫基類的解構函式了。

如果派生類中有用new分配的記憶體,就無法釋放了

2樓:奔跑的窩牛的家

1.第一段**

#include

using namespace std;

class clxbase;

~clxbase() ;

void dosomething() ;

};class clxderived : public clxbase;

~clxderived() ;

void dosomething() ;

};int main()

執行結果:

do something in class clxderived!

output from the destructor of class clxderived!

output from the destructor of class clxbase!

這段**中基類的解構函式不是虛擬函式,在main函式中用繼承類的指標去操作繼承類的成員,釋放指標p的過程是:先釋放繼承類的資源,再釋放基類資源.

2.第二段**

#include

using namespace std;

class clxbase;

~clxbase() ;

void dosomething() ;

};class clxderived : public clxbase;

~clxderived() ;

void dosomething()

};int main()

輸出結果:

do something in class clxbase!

output from the destructor of class clxbase!

這段**中基類的解構函式同樣不是虛擬函式,不同的是在main函式中用基類的指標去操作繼承類的成員,釋放指標p的過程是:只是釋放了基類的資源,而沒有呼叫繼承類的解構函式.呼叫dosomething()函式執行的也是基類定義的函式.

一般情況下,這樣的刪除只能夠刪除基類物件,而不能刪除子類物件,形成了刪除一半形象,造成記憶體洩漏.

在公有繼承中,基類對派生類及其物件的操作,只能影響到那些從基類繼承下來的成員.如果想要用基類對非繼承成員進行操作,則要把基類的這個函式定義為虛擬函式.

解構函式自然也應該如此:如果它想析構子類中的重新定義或新的成員及物件,當然也應該宣告為虛的.

3.第三段**:

#include

using namespace std;

class clxbase;

virtual ~clxbase() ;

virtual void dosomething() ;

};class clxderived : public clxbase;

~clxderived() ;

void dosomething() ;

};int main()

執行結果:

do something in class clxderived!

output from the destructor of class clxderived!

output from the destructor of class clxbase!

這段**中基類的解構函式被定義為虛擬函式,在main函式中用基類的指標去操作繼承類的成員,釋放指標p的過程是:只是釋放了繼承類的資源,再呼叫基類的解構函式.呼叫dosomething()函式執行的也是繼承類定義的函式.

如果不需要基類對派生類及物件進行操作,則不能定義虛擬函式,因為這樣會增加記憶體開銷.當類裡面有定義虛擬函式的時候,編譯器會給類新增一個虛擬函式表,裡面來存放虛擬函式指標,這樣就會增加類的儲存空間.所以,只有當一個類被用來作為基類的時候,才把解構函式寫成虛擬函式.

c++中類的成員函式重定義和虛擬函式有什麼區別?

3樓:皇家救星

虛擬函式可以實現多型,過載不行

多型就是用同一個呼叫方式實現不同呼叫

比如,你定義了一個名為形狀的父類,裡面有一個計算面積的虛擬函式。並且派生了兩個子類,一個是圓,一個是方形,各自實現了自己的計算面積函式

這樣,你想要計算面積的時候,並不需要考慮圓和方形的區別。只需要 父類.計算面積 這樣呼叫,編譯系統會自動幫你選擇用圓的計算面積,或是用方形的計算面積

4樓:匿名使用者

這都是在繼

承的類中用到的。

在繼承的類中有函式定義和父類中的函式定義重複,就是override,過載

在把一個子類的物件定義給父類的變數的時候,對於同一個函式名的函式,c++將應用那個父類的函式定義。

如果父類的這個函式被定義為virtual,將會呼叫子類的。

class a

};class b : public a

返回this is a.

如果class a

};返回this is b.

C 為什麼不要把函式定義都放標頭檔案裡

happy黃東陽 要害主要還是在標頭檔案定義類會暴露具體的實現方法,而在matlab這種軟體的一些自帶矩陣運算函式都是經過他們公司的研究實現的最高效的演算法,涉及到智慧財產權,源 自然不會給你看,這時候只提供給你編譯好的庫檔案和標頭檔案就能避免洩露,至於重新編譯標頭檔案沒什麼影響,因為標頭檔案還有庫...

C語言中函式的定義格式是什麼,函式原型宣告的語法格式

天雲一號 函式定義就是規定函式的格式與功能。函式宣告就是在函式呼叫之前進行的一種說明。下面舉例說明兩者的語法格式 include int fun int a,int b 函式的宣告void main 下面的fun函式就是函式的定義 int fun int a,int b 注 如果被調函式 上例中為f...

為什麼我學的c語言在定義main函式時,前面沒有

一頁凌風 樓上說法有些錯誤。首先,mian函式作為主函式是程式的入口沒錯,但是它其實一定要被其他函式呼叫的,這些函式就是進入程式之前的引導。所以,有的時候,我們會發int返回值的main函式內不甚至用了引數,這些引數也是可以預設的,但實際上都被預設值了,引導程式在呼叫main函式的時候必須獲取這些值...