1

これは、他のどこにもそのような答えを見つけることができないように見えるため、学習目的のためだけです..だから私は複数の質問があります..私はそのようなことはしませんが、私の脳が私に知ることを要求するか、一日中不快だろう。

次のクラスがあるとします。

class Control
{
    //virtual stuff..
};

class Button : public Control
{
    //More virtual stuff..
};

class CheckBox : public Control
{
    //More virtual stuff..
};

したがって、Button と CheckBox は同じ親 Control の姉妹です。

ここで、moi のような好奇心旺盛な人が次のようなものを見たとします。

std::vector<Control> ListOfControls;    //Polymorphic Array.
ListOfControls.push_back(Button());     //Add Button to the Array.
ListOfControls.push_back(CheckBox());   //Add CheckBox to the Array.

Array が保持するデータ型をどのように確認できますか? ListOfControls[0] が Button を保持し、ListOfControls[1] が CheckBox を保持していることをどのように確認できますか? 動的キャストを行う必要がある可能性が最も高く、null を返さない場合は、その特定のデータ型であると読みました。

if (dynamic_cast<Button*>(ListOfControls[0]) == ???) //I got lost.. :(

私の頭から離れるべきもう一つのこと:

上記と同じクラスを想定すると、次のことをどのように伝えますか。

std::vector<void*> ListOfControls;          //Polymorphic Array through Pointer.
ListOfControls.push_back(new Button());     //Add Button to the Array.
ListOfControls.push_back(new CheckBox());   //Add CheckBox to the Array.

動的キャストなしで上記の両方の例を実行する方法はありますか、またはそれを回避するための何らかのトリックがありますか? 通常、動的キャストは決して必要ないことを読みました..

最後に、親から子にダウンキャストできますか?

Button Btn;
Control Cn;

Btn = (Button) Cn; //???
4

1 に答える 1

3

スライスのため、ポリモーフィック オブジェクトのコンテナーを持つことはできません。ポリモーフィック オブジェクトへの何らかの種類のポインターのコンテナーが必要です。そうでなければあなたは正しいです。配列にポインタが含まれているオブジェクトの実行時型を使用するdynamic_castか取得する必要があります。typeid

ただし、ポリモーフィック オブジェクトの実際の型に依存しないコードを作成するようにしてください。基本クラスでインターフェイスを一般化し、ポインターでこれらのメンバー関数を呼び出すだけです。これにより、既存のコードの変更を最小限に抑えて、コードをよりクリーンにし、拡張性を高めることができます。

于 2013-03-10T22:50:34.097 に答える