c++中析構函式能否為純虛函式?
可以!!c++中定義乙個純虛析構函式是合法的,並且最重要的一點是如果某個類包含純虛析構函式,則類必須給此函式定義函式體。
看起來這種現象很奇怪,純虛函式怎麼會需要定義函式體呢?但是,因為析構函式的呼叫順序總是與構造順序相反,這就意味著派生類的析構總是先被呼叫,然後再呼叫基類的析構。
如果純虛析構函式沒有給出定義,則物件析構時如何呼叫這個函式?因此,編譯器以及鏈結器強制規定純虛析構函式的函式體必須存在。
#include class base ;
class derived : public base
};int main()
linux平台(gcc 4.8.5 in centos 7.2):
in function `derived::~derived()':
(.text._zn7derivedd2ev[_zn7derivedd5ev]+0x2e): undefined reference to `base::~base()'
windows平台(visual studio 2015):
error lnk2019: 無法解析的外部符號 "public: virtual __thiscall base::~base(void)" (??1base@@uae@xz),該符號在函式 "public: virtual __thiscall derived::~derived(void)" (??1derived@@uae@xz) 中被引用
下面程式中,提供了純虛析構函式的定義,則程式編譯執行正常。
#include class base ;
base::~base()
class derived : public base
};int main()
執行結果:
~derived() is executed
pure virtual destructor is called
C 虛函式,純虛函式,虛析構和純虛析構
c 虛函式 定義為虛函式是為了允許用基類的指標來呼叫子類的這個函式,是需要具體實現的 virtual void funtion1 c 純虛函式 一 定義 純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加 0 vir...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...
C 虛析構函式 純虛析構函式
虛析構函式 析構函式的工作方式是 最底層的派生類 most derived class 的析構函式最先被呼叫,然後呼叫每乙個基類的析構函式。因為在c 中,當乙個派生類物件通過使用乙個基類指標刪除,而這個基類有乙個非虛的析構函式,則結果是未定義的。執行時比較有代表性的後果是物件的派生部分不會被銷毀。然...