2017-09-01 4 views
1

次のコードがあります。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を使用する必要があります正しい機能。可能であれば詳細な説明が必要です。ありがとう!

+1

'dynamic_cast'が失敗する可能性がある、派生するベースを鋳造するために使用されています。ベースに派生し、常に動作し、キャストは必要ありません。 –

+0

ありがとう、私はあなたの説明に感謝します。 –

答えて

1

幸いにも、あなたと私のキーボードの両方のために、説明は簡単です:

((Base)d)スライス値-コピーBaseインスタンスへのオブジェクトdBaseしたがってDerivedが多型のタイプであるので

((Base*)d1)->f()は依然として派生メソッドをコールし、((Base*)d1)Base*ポインタであるが、それはDerivedオブジェクトを指しています。同義語についてはstatic_castおよびdynamic_castです。

参考:https://en.wikipedia.org/wiki/Object_slicing

関連する問題