2

基本クラス オブジェクトと派生クラス オブジェクトの間で前後にキャストするためのデモンストレーションとして、単純なプログラムを作成しようとしています。これが私のコードです

#include "stdafx.h"
#include <iostream>

using namespace std;

class a
{
    virtual void hi(){}
};

class b : public a
{
};

int main()
{
    a abs = b();
    b& bbs = dynamic_cast<b&>(abs);
    while(true);
}

コードは正常にコンパイルされますが、実行すると、「クラス Tests.exe の 0x75C4C41F で未処理の例外: Microsoft C++ 例外: メモリ位置 0x003DF908 の std::bad_cast」が発生します。私が間違っていることはわかりません。これが機能しない理由を誰かに説明してもらえますか。

4

4 に答える 4

6

「スライシング」と呼ばれる C++ の問題が発生しています。基本的にabsaではなくbです。

a abs = b();
  1. 新しいbオブジェクトを作成します。
  2. を受け取るaコンストラクターを探し、( からへの暗黙的な変換に基づいて)bのコピー コンストラクターを見つけます。aba
  3. 新しいbオブジェクトをa( に固有の部分を破棄することによってb) に変換し、それを のコピー コンストラクターに渡しますa

オブジェクトをポリモーフィックにコピーする必要がある場合 (これは、実際のコードで実際に必要なものである場合とそうでない場合があります)、典型的な方法は次のようにすることです。

class a
{
public:
    virtual a *clone() { return new a(*this); }
};

class b
{
    virtual a *clone() { return new b(*this); }
};

b my_b;
a *abs = my_b.clone();

繰り返しますが、この場合にそれが必要かどうかはわかりませんが、それはあります。

于 2013-10-22T22:59:38.510 に答える
3

コードにエラーがあります。absは 型のオブジェクトでありa、 の匿名インスタンスからコピーが作成されましたb。必要なのは のインスタンスであり、への参照をb作成します。absa

b bbs;
a &abs = bbs;
b &bbr = dynamic_cast<b&>(abs);

aポリモーフィズムを使用するため、仮想デストラクタを定義する必要があります (ただし、この例では必須ではありません)。

于 2013-10-22T22:59:11.760 に答える
1

オブジェクトを動的にキャストすることはできません。参照またはポインターのみをキャストできます。

に変更します

a* abs = new b();
b* bbs = dynamic_cast<b*>(abs);

また

b obj_b = b();
a& abs = obj_b;
b& bbs = dynamic_cast<b&>(abs);
于 2013-10-22T22:57:06.950 に答える
1

これはおそらくあなたがやろうとしていたことです:

#include <iostream>

class a
{
    public:
        virtual void hi(){}
        virtual ~a() {}
};

class b : public a
{
};

int main()
{
    b b_obj;
    a& a_ref_to_b = b_obj;
    b& b_ref_to_b = dynamic_cast<b&>(a_ref_to_b);
    return 0;
}
于 2013-10-22T23:00:14.637 に答える