問題を引き起こすコードは次のとおりです。
class Base
{
public:
virtual void fun()
{
cout<<"Base";
}
};
class Der:public Base
{
Base &pb;
public:
Der(Base&b):pb(b){}
virtual void fun()
{
cout<<"Der...";
pb.fun();
}
};
int main()
{
Der(Der(Base())).fun();
return 0;
}
このコードを実行すると、結果は「Der ... Base ...」と表示されます!これはすごいので、なぜ結果が論理的に正しい「Der ... Der ... Base」ではないのか理解できませんか?!次に、クラスDerのメンバーをに置き換え、Base&pb
コードBase*pb
を正当なものに変更します。最終的に、出力は「Der ... Der...Base」です。Base&pb
コードをデバッグすると、を使用すると、Derのコンストラクターが使用中に1回だけ実行されBase*pb
、コンストラクターが2回正しく実行されたことがわかりました。何が起こったのか、そしてその理由を私に説明できる人はいますか?