2010-09-19 99 views
1

可能重複:
When to use virtual destructors?爲什麼在繼承使用虛擬析構函數

比方說,我有一個抽象類動物

class Animal { 
public: 
    Animal(const std::string &name) : _name(name) 
    { 
    } 
    virtual void Print() const = 0; 
    virtual ~Animal() {} 
protected: 
    std::string _name; 
}; 

,我有狗和貓繼承這個班。 在我正在閱讀的書中,建議在基類中定義一個虛擬析構函數。 我試圖創建沒有虛擬des定義的對象,程序運行良好,沒有泄漏(使用valgrind進行檢查)。 所以我的問題是爲什麼使用虛擬析構函數(空實現)?它有什麼好處?

謝謝!

+1

[何時使用虛擬析構函數?](http://stackoverflow.com/questions/461203/when-to-use-virtual-destructors) – 2010-09-19 18:03:09

回答

1

當你有這樣的事情:

class Dog : public Animal { 
public: 
    Dog() { 
     data = new char[100000]; 
    } 
    ~Dog() { 
     delete data; 
    } 
private: 
    char* data; 
}; 

Animal* dog = new Dog; 
delete dog; 

沒有虛析構函數,編譯器使用析構函數從動物類。並且Dog類中分配的內存將泄漏。 當您在基類中定義虛擬析構函數時,編譯器使用Dog類中的析構函數和空閒分配的內存。