次のコードがあります。static_cast、dynamic_cast、または明示的な変換を使用したBaseポインタ変換への派生ポインタは、基底関数を呼び出しません。
#include <iostream>
using namespace std;
class Base
{
public:
virtual int f(){cout<<"Base"<<endl;}
};
class Derived:public Base
{
public:
int f(){cout<<"Derived"<<endl;}
};
int main()
{
Base b;
Derived d;
b.f(); ///base
((Base)d).f(); ///base
cout<<"----------------"<<endl;
Base *b1 = new Base;
Base *b2 = new Derived;
Derived *d1 = new Derived;
b1->f(); ///base
((Base*)d1)->f(); ///derived
((Base*)b2)->f(); ///derived
static_cast<Base*>(d1);
d1->f();///derived
static_cast<Base*>(b2);
b2->f();///derived
cout<<"----------------"<<endl;
Base *b5 = dynamic_cast<Base*>(b2);
Base *b6 = dynamic_cast<Base*>(d1);
if(b5)
b5->f(); ///derived
if(b6)
b6->f(); ///derived
return 0;
}
は、私は明示的なキャスト(ベース)、スタティックキャスト(static_castを(D1))または動的キャストを使用して塩基に変換するとき、なぜ派生* D1 OR B2ポインタをお願いしたいと思います(dynamic_castを(D1))変換後の基本クラスのf()関数は呼び出されません。派生クラスから毎回f()関数を呼び出すようです。
また、私がオブジェクトをこのように宣言すると、不思議なことに。変換が行われ、基本関数が呼び出されます。
Base b;
Derived d;
b.f(); ///base
((Base)d).f(); ///base
は今、私はd->Base::f()
だろう基本クラスから)という(Fにアクセスするための正しい方法を理解し、彼らは、ベースとコールする派生ポインタを変換しませんので、私はなぜdynamic_castのかはstatic_castを使用する必要があります正しい機能。可能であれば詳細な説明が必要です。ありがとう!
'dynamic_cast'が失敗する可能性がある、派生するベースを鋳造するために使用されています。ベースに派生し、常に動作し、キャストは必要ありません。 –
ありがとう、私はあなたの説明に感謝します。 –