簡體   English   中英

在派生指針上顯式調用基類析構函數時發生編譯錯誤

[英]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

在您的代碼中, TB ,並且對IBase查找顯然找不到引用B的名稱。 因此,您的代碼格式錯誤。 如果g ++接受,則可能是錯誤或擴展。

由於聽起來好像B類型表示的實際類型在您的真實代碼中是“難以言說的”,但是IBase可以編寫,所以最簡單的解決方案是將b IBase *IBase *

這是一個已知的錯誤。 至於“為什么”失敗,我沒有答案。 您的示例的解決方法可能是:

B->廣積::〜廣積();

基類析構函數會自動調用。 如果您手動調用基類的析構函數,則在對象被銷毀時將再次調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM