基本コンストラクターから仮想関数を呼び出すと、コンパイラーはエラーを出しません。しかし、基本クラスのコンストラクターから純粋仮想関数を呼び出すと、コンパイルエラーが発生します。
以下のサンプルプログラムを検討してください。
#include <iostream>
using namespace std;
class base
{
public:
void virtual virtualfunc() = 0;
//void virtual virtualfunc();
base()
{
virtualfunc();
}
};
void base::virtualfunc()
{
cout << " pvf in base class\n";
}
class derived : public base
{
public:
void virtualfunc()
{
cout << "vf in derived class\n";
}
};
int main()
{
derived d;
base *bptr = &d;
bptr->virtualfunc();
return 0;
}
ここでは、純粋仮想関数に定義があることがわかります。bptr->virtualfunc()
基本クラスで定義された純粋仮想関数は、が実行されたときに呼び出されることを期待していました。代わりに、コンパイルエラーが発生します。
エラー:コンストラクターから呼び出された抽象仮想 `virtual void base :: virtualfunc()'
これの理由は何ですか?