帶了虛方法解構函式就一定要virtual嗎

2021-12-29 03:42:17 字數 1928 閱讀 9786

1樓:匿名使用者

先說說什麼時候是必須使用解構函式的:只有需要刪除堆中生成的物件時,才必須使用解構函式。什麼時候需要使用虛解構函式:

1當用基類的指標指向子類物件,此時如果只是呼叫解構函式就只會執行基類的解構函式而不執行子類的解構函式。此時就要用到虛解構函式。因為虛解構函式可以動態繫結到子類物件。

從而正確地析構。2子類使用了虛解構函式,那麼父類也要用虛解構函式。

2樓:匿名使用者

解構函式不一定要virtual,但是建議virtual,原因如下:

子類的方法可能會覆蓋基類的方法,而基類的指標/引用可能指向/繫結子類的物件,因此有時候無法單從編譯時的型別來判斷物件究竟是哪種型別。虛方法的作用在於呼叫該方法時能確保識別物件究竟是哪種型別。比如假設b是a的子類,則以下語句

b b;

a *a = &b;

a->foo();

如果foo不是虛方法,呼叫的是的a類的foo();如果foo是虛方法,呼叫的是b類的foo()。

因此帶了虛方法說明子類可能會重寫這個方法,而在重寫的方法裡可能會在靜態儲存區建立物件(比如new),需要呼叫重寫的解構函式來釋放這些物件,因此最好將解構函式設為虛方法。

帶了虛方法,解構函式就一定要virtual嗎

3樓:楊好巨蟹座

如果 a的解構函式不是virtual的,那麼此時就不是先呼叫b的解構函式再呼叫a的解構函式。

output:

~a();

如果a 的解構函式為virtual,則先~b(),再~a()

output:

~b();

~a();

類如果會被派生的話,解構函式一般都應該定義為virtual的,主要不是防止記憶體洩露,而是為了正確的析構。如果是個封閉類(即不再被派生),就不要定義為virtual的。虛擬函式畢竟耗費較大的。

不用virtual 的幾種情況:

1、作為非公有基類。僅作為 private base class 使用的 class 不需要使用虛擬解構函式

2、不作為介面使用的基類。

3. 如果你可以保證這個類不被public繼承(private/protected繼承的話,在非friend函式/類中就無法用基類指標指向派生類了)

4. 如果它的所有派生類(包括派生類的派生類)的解構函式都是trivial的(這裡的trivial指的是在程式設計師的層次什麼事也不做)

5. 如果不需要用基類的指標指向派生類的物件

在這五種情況下,不把解構函式宣告為virtual都是可以的,何況效率會高一些——但前提是你得保證前提的成立——不過這些保證常常是很難100%的:誰能保證別人在派生你的類的時候,解構函式是trivial的,或者別人不用你提供的基類的指標指向派生類物件?這些常常是很難得到保證的。

4樓:羿小天

如果基類裡面有虛成員函式,則最好把解構函式也設定為虛擬函式

否則,派生類在用基類指標呼叫時,發生記憶體洩露,析構時不會呼叫派生類的解構函式

如果基類沒有需成員函式,則無所謂解構函式是不是虛擬函式!

帶了虛方法,解構函式就一定要virtual嗎

5樓:匿名使用者

先說說什麼時候是必須使用解構函式的:只有需要刪除堆中生成的物件時,才必須使用解構函式。什麼時候需要使用虛解構函式:

1當用基類的指標指向子類物件,此時如果只是呼叫解構函式就只會執行基類的解構函式而不執行子類的解構函式。此時就要用到虛解構函式。因為虛解構函式可以動態繫結到子類物件。

從而正確地析構。2子類使用了虛解構函式,那麼父類也要用虛解構函式。

用了虛方法的類就算沒有虛解構函式也可以正確析構,所以虛解構函式不是必須的。但是既然你用了虛方法,就說明這個類很可能用到多型並且設涉及到上述的使用虛解構函式的情況,所以建議你加上virtual。

c 什麼是虛擬函式,構造與解構函式可以是虛擬函式嗎

虛擬函式用於實現類的繼承所體現的多型性,當一個類的成員函式被宣告為虛的,那麼這個類的派生類如果過載了這個函式,那麼在呼叫這個函式時,會先確認這個類例項是原來的類還是派生類 因為父類的指標可以指向子類 如果是父類,那麼呼叫父類的版本,如果是子類,則呼叫對應的子類的版本。class a class b ...

c 關於解構函式的問題,C 關於解構函式的一個問題

如果你的物件在複製的時候不適合淺複製,而且整個過程中你也不需要對它進行復制,那麼一個比較好的方法就是寫一個複製建構函式 mystring const mystring 然後不實現。沒錯就是隻寫這麼一個宣告放那邊。如果程式中用到了複製構造,那麼連結的時候就會報錯,可以幫助你遠離深複製淺複製的問題。另 ...

有關解構函式和const的問題謝謝了

首先,建構函式是在物件建立時執行,而解構函式是在物件消亡時執行的,也就是說,你在new一個物件的時候就執行了建構函式,delete的時候就執行了解構函式.其次,c 特有的new和delete就是為確保構造和解構函式能夠準確執行才創造的,而你用c語言的malloc和free那就不能確保構造和析構的發生...