![](/img/trans.png)
[英]Missing Derived class Destructor when object is created with the base class pointer
[英]Compile error when explicitly calling the base class destructor on a derived pointer
就像標題說的那樣。 以下人為設計的示例似乎可以在鍵盤上使用: http : //codepad.org/4cgGmvDQ以及Linux機器上的GCC 4.1.2。
#include<stdlib.h>
#include<new>
class IBase
{
public:
virtual ~IBase(){}
};
class B : public IBase
{
public:
virtual ~B(){}
};
class D : public B
{
public:
virtual ~D(){ }
};
int main()
{
void* p = malloc(sizeof(D));
D* d = new(p) D();
B* b = static_cast<B*>(d);
b->~IBase();
free(p);
}
但是Visual Studio Pro 2012 11.0.61030.00更新4失敗並顯示以下信息:
main.cpp(30): error C2300: 'B' : class does not have a destructor called '~IBase'
顯然,可以輕松地對示例進行重新設計以避免出現此問題,但是我的實際代碼庫沒有給我任何其他選擇。 是否有人熟悉Microsoft編譯器的這種特定故障?
這不是MSVC中的錯誤。 根據標准§3.4.5[basic.lookup.classref] / p2-3(引用N3936,重點是我的):
如果類成員訪問(5.2.5)中的id-expression是非限定id ,則[...]
如果unqualified-id是
~type-name
,則在整個postfix-expression的上下文中查找該類型名 。 如果對象表達式的類型T
是類類型C
,則也在類C
的范圍內查找類型名稱。 至少一個查詢應找到一個引用(可能是cv限定)T
。
在您的代碼中, T
為B
,並且對IBase
查找顯然找不到引用B
的名稱。 因此,您的代碼格式錯誤。 如果g ++接受,則可能是錯誤或擴展。
由於聽起來好像B
類型表示的實際類型在您的真實代碼中是“難以言說的”,但是IBase
可以編寫,所以最簡單的解決方案是將b
IBase *
為IBase *
。
這是一個已知的錯誤。 至於“為什么”失敗,我沒有答案。 您的示例的解決方法可能是:
B->廣積::〜廣積();
基類析構函數會自動調用。 如果您手動調用基類的析構函數,則在對象被銷毀時將再次調用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.