2017-03-21 427 views
1

我想破壞類B的對象。從C++中的虛析構函數調用虛擬方法

class A { 
public: 
    A() { 
     std::cout << "construct A" << av::endl; 
     a = new int; 
    } 
    virtual ~A() { 
     std::cout << "destruct A" << av::endl; 
     this->clear(); 
    } 
    virtual void clear() { 
     std::cout << "clear A" << av::endl; 
     delete a; 
    } 
protected: 
    int *a; 
}; 

class B : public A { 
public: 
    B() { 
     std::cout << "construct B" << av::endl; 
     b = new int; 
    } 
    ~B() { 
     std::cout << "destruct B" << av::endl; 
    } 
    void clear() override { 
     std::cout << "clear B" << av::endl; 
     delete b; 
     delete this->a; 
    } 
private: 
    int *b; 
}; 

我想用clear()方法完成。但是,當我執行下面的代碼:

A *a = new B(); 
delete a; 

我得到:

構建構建體B自毀乙破壞清晰的一個

而且clear B從不打印。 我在做什麼錯?

回答

5

非正式地,在~A(); B部分已經被破壞,調用B的任何函數都沒有任何意義。


有效的C++項目9:從不在施工或銷燬期間調用虛函數。

一旦一個派生類的析構函數已經運行,該對象的派生類 數據成員假設未定義的值,所以C++將它們視爲如果他們沒有 不再存在。在進入基類析構函數時,對象 成爲一個基類對象,C++的所有部分 - 虛函數, dynamic_cast s等等 - 就這樣處理。

+0

感謝提到「有效的C++」,我想它的時間讓我再次運行它。 – StahlRat