-1

基本クラスからキャストされた派生クラスを初期化するための推奨される方法は何ですか?

次のシナリオを検討してください。

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

    class B : public A{
        public:
           B() {m_b = 0.0;};
           ~B();
           float GetValue(){return m_b;};

        private: 
           float m_b;
    }


    A* a = new A;
    B* b = static_cast<B*>(a);

    float val = b->GetValue();   // This was never initialized because it was not constructed

私の現在の解決策は、コンストラクターと同じように必要な初期化を実行する Initialize() 関数を手動で呼び出すことです。

ずさんなようですが、より良い/よりクリーンな方法が必要です。

どんな助けと指導も大歓迎です!

4

6 に答える 6

5

これは不完全な構造です:

A* a = new A;
B* b = static_cast<B*>(a);

編集

それは本当にあるべきです:

B* b = new B();

sbi が指摘したように、A には GetValue() という仮想関数がないため、A から呼び出すことはできません。

A* から B* への static_cast を実行しないでください。

于 2011-05-11T15:38:20.587 に答える
2

親オブジェクトを派生型のオブジェクトにキャストしています。それは明らかに間違っています。クラス A のオブジェクトには、初期化する m_b メンバーがありません。

于 2011-05-11T15:37:31.037 に答える
0

sizeof(A)オブジェクトはで作成され、sizeof(B)明らかに大きい ため、これがまったく有効かどうかはわかりません。

于 2011-05-11T15:36:08.563 に答える
0

BはAであるため、記述したコードは危険で無効ですが、その逆ではありません。これは有効です:

B* b = new B;
A* a = dynamic_cast<A*>(b);
于 2011-05-11T15:38:11.940 に答える
0

初期化する派生クラスのインスタンスはありません。基本クラスのインスタンスしかありません。1static_cast1 が行っているのは、基本クラスを派生クラスとして扱うことをコンパイラに強制することだけです。

代わりに、を作成するBには、次のことを行う必要があります。

A* a = new B;

それは のコンストラクタを呼び出し、Bに初期化m_b0.0ます。

于 2011-05-11T15:38:14.253 に答える
0
B* b = static_cast<B*>(a);

が のオブジェクトまたは から派生したクラスを実際に指してstatic_castいることがわかっている場合にのみ、これを使用する必要がありますが、明らかにそうではありません。 aBB

誤った記述です。
有効なシーケンスは次のとおりです。

 A* a = new B();
 B* b = static_cast<B*>(a);

a型のオブジェクトを指すようになりましたB。それができるのは、Base クラスのオブジェクトへの Pointer は、パブリックな派生である限り、常に派生クラスのオブジェクトを指すことができるためです。

が実際に のオブジェクトを指してstatic_castいることが確実にわかっているので、これで使用できます。 クラスの階層を認識していないシナリオがあり、そのようなシナリオではC++ を使用できませんそのようなシナリオで呼び出される別のキャスト型を提供します。ポインターまたはスローの場合にキャストが有効でない場合、NULL ポインターを返します。参照の場合は例外です。aclass B
static_castDynamic_cast

Dynamic_Castただし、ポリモーフィック クラスでのみ機能することに注意してください。

于 2011-05-11T15:38:37.343 に答える