2

私は本当に混乱しているので、これを聞かなければなりません。アプリケーションを作成しようとしましたが、Baseクラスのベクトルにある派生クラスの変数に到達する方法がわかりません。コードは次のとおりです。

class A {
public:
    A() { };

    std::vector<A> aVector;

    void Foo();
}

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

    int j;
}

void A::Foo() {
    aVector.push_back( B() );

    // Here I would like to reach B::j, but only the members and variables of A comes in
    aVector[0].j; // wrong
    B b = aVector[0];   // no suitable user-defined conversion from "A" to "B" exists
                        // should I use cast? which one?
}

私は現在、アプリケーションプログラミングを通じて継承とこの種のことを学んでいますが、今は本当に行き詰まっています。

他の質問を探しましたが、問題を解決する質問が見つかりませんでした。ある場合、そして私が逃した場合は、申し訳ありません。

4

4 に答える 4

2

ベクトルにプッシュされたときに新しいオブジェクトが「スライス」されないように(ここでpointersの説明を参照)、に保存する必要があります。AB

castまた、基本クラスからのポインタで子メソッド/変数を具体的に使用する場合は、適切な型にする必要があります

std::vector<A*> aVector;
aVector.push_back(new B());
B* b = (B*)aVector[0];
cout << b->j;
// remember to delete the content of aVector

このようなオブジェクトをキャストすると、キャストしているタイプであることが100%確実でない場合、危険な場合があります。

キャストの詳細については、このスレッドを参照してください( C style、、dynamic_castおよびstatic_cast

于 2012-11-26T17:14:50.177 に答える
1

vectorタイプのオブジェクトを保持するように宣言されているため、ベクトルにAaをプッシュすると、に格納されているオブジェクトからすべての-nessが削除されます。これは、スライスの問題として知られています。BBvector

後でB保存されているオブジェクトの要素にアクセスしようとするvectorと、それらは単に存在しないため、アクセスできません。あなたはvectorBオブジェクトを持っていません-あなたはオブジェクトを持っていvectorますA

この問題を解決するには、Aオブジェクトを値ではなく、参照またはポインターで格納する必要があります。に参照を格納することはできないvectorため、ポインタが残ります。

于 2012-11-26T17:19:22.230 に答える
0

これはベクトルとは何の関係もありません。Bから派生した場合A、次のコード:

A a;
B b = a;

エラーです(変換する方法がない限り)。

これは正しいです-あなたが均一に扱うことができるはずのあなたのベクトルアイテム。これがベクトルを使用するコードがすべてのアイテムを期待していることを意味する場合は、をB作成するだけvector<B>です。そうでなければABとにかくに変換するビジネスはありません。

于 2012-11-26T17:14:19.870 に答える
0

基本クラスから派生クラスのメンバーにアクセスしようとしないでください。基本クラスは、派生クラスの実装の詳細に依存しない必要があります。あなたがしていることは多形ではありません。つまり、仮想メソッドを提供せず、仮想メソッドをオーバーライドしないため、BインスタンスはAインスタンスのように動作できません。

全体の設計とアプローチは正しくありません。A :: Foo()は仮想メソッドである必要があります(おそらく抽象メソッドですら)。そして、B :: Foo()で作業を行う必要があります。

そしてもう1つ、単純な古いAのベクトルを保持するべきではありません。それはAへのポインターである必要があります。したがって、std::Vectorです。また、そのメンバーには、クラスのメンバー変数であることを示すために、文字mをプレフィックスとして付ける必要があります。したがって、std :: vector mSomething;

于 2012-11-26T17:24:15.687 に答える