普通の関数の中で虚関数を呼び出すのと構造関数の中で虚関数を呼び出すのはどんな違いがありますか?

929 ワード

面接でよくある問題.
実際に文法的には問題ありませんが、コンパイルは通過できます.問題は,コンストラクション関数で虚関数を呼び出すとマルチステートが実現できないことである.
次のコードを見てください.
class A
{
public:
	A() { show(); }// 4
	virtual void show() { cout << "A"; }
	void anotherShow(){show();}// 6
};
 
class B:public A
{
public:
	B() { show(); }
	virtual void show() { cout << "B"; }
};

Bクラスオブジェクトを定義すると、ABが出力されます.
B b;//  :AB

bオブジェクトのanotherShowを呼び出すと、Bが出力されます.
b.anohterShow();//  :B

行4では親クラスのshowが呼び出され,行6では子クラスのshowが呼び出されることが分かる.
これは、子クラスオブジェクトを定義するときに、親クラスのコンストラクタが呼び出されるためです.、このとき,ダミー関数テーブルおよびサブクラスの関数はまだ初期化されていないが,初期化されていないメモリへの呼び出しを避けるために,C++標準仕様では,サブクラスを構築する際に親クラスのコンストラクション関数を呼び出し,親クラスのコンストラクション関数ではダミーメンバー関数を呼び出し,このダミーメンバー関数は布団クラスが書き換えられてもマルチステートの動作を許さないことが規定されている.静的バインドを使用して、親クラスの関数を呼び出します.——————————————————テキストリンク:https://blog.csdn.net/huang1433/article/details/50932427