2016-05-24 13 views
1

const参照のbaseタイプAを返す関数getA()があります。それはdynamic_castできません。したがって、const参照のコピーを作成して参照を作成します。オブジェクトをコピーし、私はコピーされたオブジェクトの参照にdynamic_castを呼び出すと、それは失敗し、コードを以下に示す:コピーされたオブジェクトへの参照のdynamic_castが失敗しました

struct A { 
    int c = -1; 
    virtual ~A() {} 
}; 

struct B : A {int aa = 0;}; 

const A& getA(){ 
    std::unique_ptr<A> ap(new B); 
    return *ap; 
} 


int main() 
{ 
    const A& a = getA(); 
    A acopy = a; 
    acopy.c = -2; 
    A& acopyr = acopy; 
    std::cout << a.c << std::endl; 
    try{ 
    B& b = dynamic_cast<B&>(acopyr); 
    std::cout << b.aa << std::endl; 
    }catch(std::bad_cast b){ 
    std::cout << "bad" << std::endl; 
    } 
} 

出力

-1 
bad 
+1

'dynamic_cast (a)'は必要なものではありませんか?編集:また、 'getA()'は、 'ap'がその中括弧でその肩代わりを破壊するので、手掛かりのない参照を返します。 – Quentin

+2

なぜ 'acopy'は' B'だと思いますか?あなたは 'A acopy = a;'で 'A 'にします。 – NathanOliver

+0

@ NathanOliverでも 'a'は' B'ですが、そうではありませんか? – user3828398

答えて

2

あります3210は、動的(および静的)タイプAのオブジェクトです。それが宣言されたことに注目してください:タイプAのオブジェクト。もちろん、B&にキャストすることはできません。

あなたの説明から、getA()constに、Bに動的にキャストしたいと思っています。

const B& b = dynamic_cast<const B&>(getA()); 

サイドノート:それからあなたを止めるものは何もありません私はあなたの質問でgetA実装はデモンストレーションの目的のためだけであると仮定し、それは非常に間違っです。 apが範囲外になると(すなわち、getAが返るとすぐに)、それはそれが指しているオブジェクトを破壊するので、ダングリングリファレンスを返して、未定義動作を呼び出します。

関連する問題