2016-05-29 2 views
2

ダイナミックキャストからのベースクラスポインタへの参照を取得することは可能ですか?dynamic_castから非const参照を取得する

#include <cassert> 

class A{ 
public: 
    virtual ~A(){} 
}; 

class B : public A{}; 


int main(){ 
    A *a = new B; 

    B *&b = dynamic_cast<B *>(a); 

    // work with pointer as of type B 

    b = new B; // this should change a aswell 

    assert(a == b); 
} 

このコードは

答えて

3

エラーなしinvalid initialization of non-const reference of type 'B*&' from an rvalue of type 'B*'してコンパイルされていない、あなたがすることはできません。

dynamic_cast<B *>(a);B*にタイプA*aを変換します、それはタイプB*の一時的に構築し、それを返します。一時変数は非const左辺参照にバウンドすることはできません。 const参照にバインドされている可能性がありますが、後で変更することはできません。

1

任意のキャスト式の値カテゴリは、キャストの宛先タイプによって異なります。

  • 宛先タイプは、非参照(T)です:prvalue
  • 宛先タイプは左辺値参照(T&)です。左辺値
  • 宛先タイプは右辺値参照(T&&)です:はxValue

あなたの宛先タイプが01であるので、、非参照、キャストの結果はprvalueであり、可変値の左辺値参照にバインドできません。

あなたは*aがサブオブジェクトとなっているほとんどの派生オブジェクトを交換しようとしている場合、あなたはこのような何かを試みることができる:これはデストラクタの実行に失敗したことを

assert(typeid(*a) == typeid(B)); 
void* addr = dynamic_cast<void*>(a); 
::new (addr) B; 

注意を、あなたのコードであればそうデストラクタの副作用によって異なりますが、動作は未定義です。最初にデストラクタを実行することもできます。

a->~A();      // if A::~A is virtual 
dynamic_cast<B*>(a)->~B(); // otherwise 
関連する問題