大家都知道基類的破壞者通常必須是虛擬的。但是派生類的析構函數是什麼?在C++ 11中,我們有關鍵字「覆蓋」和明確使用默認析構函數的能力。虛擬析構函數的默認覆蓋
struct Parent
{
std::string a;
virtual ~Parent()
{
}
};
struct Child: public Parent
{
std::string b;
~Child() override = default;
};
在Child類的析構函數中使用關鍵字「override」和「= default」是否正確?編譯器會在這種情況下生成正確的虛擬析構函數嗎?
如果是的話,那麼我們是否可以認爲這是很好的編碼風格,並且我們應該總是這樣聲明派生類的析構函數以確保基類析構函數是虛擬的?
不妨做'static_assert(STD :: has_virtual_destructor ::價值,「違反合同」);' –
milleniumbug
注意,它並不總是要求基類析構函數是虛擬的。所以這只是(可能)一個好主意,如果這是一個要求。 – juanchopanza
如果它有效,我喜歡它,但milleniumbug的更好(更明確的意圖)。另一方面,Stroustrup討厭防止常見錯誤的「編碼標準」結構,並堅持編譯器應該生成適當的警告。 –