2012-02-15 4 views
1

派生クラスメンバー変数には、基本クラス変数を使用してアクセスする必要があります。基本クラス静的変数を通じて派生クラスメンバーにアクセスする必要があります

Class A{ 

}; 

Class B:public A { 
    int data; 
}; 

は今、私はこの

A *pb = new B() 
pb->data = 10; 

のような何かをする必要がありますが、問題は、私はそれwihtout派生メンバクラスにアクセスすることはできませんです。

と私はそれを仮想関数で動作させる方法を知っています。

ありがとう、本当にありがとうございます。

答えて

1

短い回答:できません。あなたのコンパイラはpbが何であるか分からないからです。タイプはAである可能性があります。ただし、を使用すると、Bポインタを返します。そうでない場合はNULLを返します。

A *pa = new B(); 
B *pb = dynamic_cast<B*>(pa); 
if (pb) { 
    pb->data = 10; 
} 
else { 
    ... 
} 

とにかく、あなたはそれはおそらく、アップキャストは良いアイデアではないとして、あなたのデザインを修正する必要があることを意味することを行う必要がある場合。時には、あなたはただそれを避けることはできません。例えば。外部ライブラリなどを使用する場合。

2

障害のある設計の必要性が指摘されています。

しかし、実際に悪いコードを書くことを主張すれば、ちょうどB *にキャストすることができます。

+0

+1ただし、キャストは安全ではないと指定する必要があります。 –

+0

ええ、実際には私のコードにはこのような状況はありません。しかし、もし私がこのようなことをしなければならないかどうか疑問に思っていました....しかし、それはどうやって設計が間違っているのでしょうか?つまり、派生したすべてのクラスメンバーは、または仮想関数を介して??? – howtechstuffworks

+0

@howtechstuffworksは、親クラスから派生クラスメンバーにアクセスすると何かが間違っていることを意味します。親は実行可能なオブジェクトであり、純粋な仮想クラスでない限り、派生オブジェクトなしで存在できる必要があります。それを行う正しい方法は、親クラスレベルで定義された仮想関数を使用することです。 – littleadv

2

仮想関数がなければ、実行できるのはダウンキャストだけです。それについて移動する方法はいくつかあります:

    あなたはRTTIを有効にして、あなたはキャストが成功したかどうかを確認するためにチェックできるようになる親クラスに少なくとも1つの仮想関数を、持っている場合
  • あなたはdynamic_castを使用することができます。
  • static_castを使用すると、継承ツリーの下にあるものにキャストできますが、成功したかどうかを確認する機能は失われます。
  • 風に注意を払い、Cスタイルのキャストを使用することもできます。
+0

仮想関数なし、dynamic_castは利用できません。 –

+0

^意味がある......私たちが仮想変数など何かを持っていれば、人生を楽にしてくれるかどうか疑問に思っていた.......しかし、動的キャストは便利です.....ありがとう – howtechstuffworks

+0

良い訂正ルチアン。私の答えを更新します... –

関連する問題