2011-12-22 20 views
14

この質問は 'とは異なります。なぜ、私はvirtualデストラクタを使用する必要がありますか? '。仮想デストラクタと未定義の動作

struct B { 
    virtual void foo(); 
    ~B() {} // <--- not virtual 
}; 
struct D : B { 
    virtual void foo(); 
    ~D() {} 
}; 
B *p = new D; 
delete p; // D::~D() is not called 

質問

  1. これは、未定義の動作に分類することができます(私たちは~D()が確かにと呼ばれることになるだろうされていないことを知っていますか)?
  2. ~D()が空の場合はどうなりますか?どのようにしてコードに影響を与えますか? B* p;new[]/delete[]を使用する際
  3. ~D()は確か かかわらず、デストラクタのvirtualネスの、呼び出されません。 は未定義の動作であるか、または明確に定義された動作ですか?
+1

私はしばしば同じことを尋ねることを考えました。私は、(1)Bは仮想メソッドを持たず、(2)Bは仮想メソッドを持っていますが、非仮想デストラクタは(3)の3つのケースを考慮して総合的な答えをしたいです。 Bには仮想デストラクタがあります。明らかに、後者のみが明確に定義されています:http://stackoverflow.com/questions/2065938/virtual-destructor –

+0

私の歯はここにあります: – mlvljr

答えて

関連する問題