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

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

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

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

ID

問題箇所

説明

1

呼び出し位置

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

2

定義

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


#include <stdio.h>

class A
{
public:
    A() {
        intermediate_call();
    }

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

    virtual void virtual_function() = 0;

    virtual ~A() {
    }
};

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)
{
    A *myObject;

    // Call to virtual_function during construction doesn't
    // behave like normal virtual function call.
    // Program will attempt to call pure virtual function
    // Since no defintion exists, program will either fail
    // to link or fail catastrophically at run time.
    myObject = new B();

    delete myObject;
}
        

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