#include <iostream>
using namespace std;
/*
* base class
*/
class A
{
public:
A()
{
this->init();
}
virtual void init()
{
cout << " A";
}
// in public, so class B can call it.
void testit()
{
this->init();
}
};
/*
* child class
*/
class B : public A
{
public:
B()
{
this->init();
}
virtual void init()
{
// here get segmentation fault.
// but if call A::init() then it is ok.
A::testit();
// if call A::init(); then it working.
cout << "B" ;
}
};
int main()
{
B b;
A * a = &b;
// here B virtual function will be called.
a->init();
return 0;
}
これは基本的に仮想関数テストです。しかし、子クラス呼び出しの基本クラスが独自の仮想関数の中で機能するとき、それはランタイムセグメンテーションフォールトを取得しました。どうして?なぜ仮想関数がセグメンテーションフォルトを与えるのですか
実行時にA :: testit()からセグメンテーションフォルトが発生すると、 なぜですか?
子インスタンスのコールベース関数がエラーになるのはなぜですか?
オブジェクトの 'init'メソッドが' A'のコンストラクタまたはデストラクタの内部で呼び出されたとき、 'B :: init'は呼び出されません。これは 'this'ポインタがその段階で' B'クラスのオブジェクトを指していないので、 'A'クラスのオブジェクトを指しているので、' init'を呼び出すと 'A :: init'代わりに。多態性は、コンストラクタとデストラクタの派生クラスへの仮想メソッド呼び出しをディスパッチしません。派生クラスはこれらのステージに存在しないためです。 –