4

この免責条項を許可します。コンストラクタまたはデストラクタの仮想関数呼び出しを明確に理解しています。デストラクタからの仮想関数の間接呼び出し

以下のコードでは、仮想デストラクタを回避するために、実験的な目的のみを使用しています。

今私の質問は:

メインで楽しみを破壊するための呼び出しは、右の仮想関数を呼び出します。 私はDestroy Functionへの呼び出しが正しい仮想の楽しみを呼び出すはずです。

しかし、同じDestroy関数は、Baseデストラクタ呼び出しに配置され、Base仮想関数を呼び出します。

静的バインディングまたはコンパイラの最適化に関連していますか?

class Base 
{ 
public: 
     Base() 
     { 
     } 
     void Destroy() 
     { 
      callVirtual(); 
     } 
     virtual void callVirtual() 
     { 
      cout<<"In Base callVirtual "<<endl; 
     } 
     ~ Base() 
     { 
      cout<<"In Base Destructor"<<endl; 

      Destroy(); 
     } 
}; 

class Derived : public Base 
{ 
    public: 
      Derived() 
      { 
      } 
      void callVirtual() 
      { 
       cout"<<In Derived callVirtual"<<endl; 
      } 
}; 

。デストラクタで

int main() 
{ 
    Base *pointer = new Derived(); 

    pointer->Destroy(); // Calls the right callVirtual 

return 0; 

} 
+1

あなたのサンプルコードがあなたの質問と何をしているのか分かりません。デストラクタが何と何をしなければならないかを明確にすることができますか? –

+0

@Oil Charlesworh:mainでは、Destroy funの呼び出しは正しい仮想関数を呼び出します。 私はDestroy Functionへの呼び出しが正しい仮想の楽しみを呼び出すはずです。 これはデストラクタの静的バインディングに関連していますか? Baseデストラクタ呼び出しに配置された同じDestroy関数がBase仮想の 関数 – vrbilgi

+1

コンストラクタ/デストラクタで仮想関数を呼び出すことを明確に理解していて、そのような質問をします。 wtf? –

答えて

5

thisの動的タイプは、現在のクラスのものではなく、オブジェクトの元のダイナミック型。例えば、 http://www.artima.com/cppsource/nevercall.html

+0

@Oil Charlesworth:説明をありがとう。その後、彼らはコンストラクタとデストラクタで動的バインディングを達成するためのハックはありません。 – vrbilgi

+0

@ user430294:関数ポインタを渡しますか? –

+0

@Matthieu:そのクラス以外のオブジェクトに対してメンバ関数ポインタを呼び出すと、未定義の動作につながります。 –

関連する問題