2014-09-25 146 views
5
class A{ 
    public: 
    A(); 
    private: 
    ~A(); 
}; 

class B:public A{ 
    public: 
    B(){}; 
    private: 
    ~B(); 
}; 

int main() 
{ 
    return 0; 
} 

我有一個編譯錯誤是這樣的:爲什麼派生的構造函數需要基礎析構函數?

test.cpp: In constructor 'B::B()': 
test.cpp:5:4: error: 'A::~A()' is private 
test.cpp:10:8: error: within this context 

我知道派生的構造函數需要調用析構函數的基礎,所以我設置A::A()public。 但是,爲什麼編譯器會抱怨它需要公開A::~A()

+0

@EdChum:不,這個問題沒有解釋爲什麼派生構造函數需要訪問基類的析構函數。 – 2014-09-25 10:38:20

+0

@MikeSeymour是的,你是對的,撤回我的近距離投票 – EdChum 2014-09-25 10:39:25

+0

你*可能*不能構建一個你不能銷燬的類,你不能銷燬'B',因爲析構函數需要訪問'〜A()'這是私有的(你需要使其受到保護或「朋友」B級)。 – firda 2014-09-25 10:42:36

回答

0

將構造函數和析構函數聲明爲public(如果確保僅由子類調用基類構造函數和析構函數,可能會對其進行保護)。當構建子類有基類實例作爲cubobject創建的,因此構造函數的顯式或隱式調用和析構函數完成

3

的C++標準委員會的核心工作組的缺陷報告1424(2011-12-07由DanielKrügler)說:

當前的規範似乎不說實現是否允許/需要/禁止在子對象的析構函數無法訪問時發生投訴。

這是通過加入被析潛在調用的概念的固定在C++ 14。標準節12.6.2(10)當前草案說:

在非委託構造器,析構函數針對每個直接或虛基類和類型的每個非靜態數據成員可能會調用(12.4)。

[注意:這個規定確保可以在引發異常(15.2)的情況下爲完全構造的子對象調用析構函數。末端音符]

而在12.4(11)

甲析構潛在調用,如果它被調用或如在5.3.4和12.6.2指定。 如果可能調用的析構函數被刪除或不能從調用的上下文訪問,則程序格式不正確。

相關問題