デストラクターでの純粋仮想関数呼び出し

純粋仮想関数を C++ デストラクターから呼び出すことはできません。

このエラーは、デストラクターにそのクラスの純粋仮想関数への呼び出しが含まれていることを示します。一般的に、どのような純粋関数もコンストラクターやデストラクターから呼び出すべきではありません。コンストラクターやデストラクターから純粋関数を呼び出しても、現在コンストラクターまたはデストラクターを実行しているクラス以外の派生クラスには移動しません。純粋仮想関数はそのクラスで実装されていないため、 この呼び出しは解決することができず、プログラムはリンクに失敗します。

この呼び出しは、派生クラスを破棄する仮想関数定義で解決されるかのように見えますが、 派生クラスがすでに破棄されているため解決されません。基本クラスのデストラクターは、派生クラスのデストラクターの前に呼び出されます。

ID

問題箇所

説明

1

呼び出し位置

仮想関数が呼び出された場所

2

定義

デストラクターが定義された場所


#include <stdio.h>

class A
{
public:
    A() {
    }

    void intermediate_call() {
        // Bad: virtual function call during object destruction
        virtual_function();
    }

    virtual void virtual_function() = 0;

    virtual ~A() {
        intermediate_call();
    }
};

class B : public A
{
public:
    // override virtual function in A
    void virtual_function()
    {
        printf("B::virtual_function called\n");
    }
};

int main(int argc, char **argv)
{
    B myObject;

    // This call behaves like a normal virtual function call.
    // Print statement shows it invokes B::virtual_function.
    myObject.virtual_function();

    // Call to virtual_function during destruction doesn't
    // behave like normal virtual function call.
    // Tries to invoke A::virtual_function even though we
    // are destroying an instance of B, not A.  Since this
    // doesn't exist the program fails catastrophically.
}
        

© 2010 Intel Corporation. 無断での引用、転載を禁じます。