0

私はクラスAを持っており、特定の種類のオブジェクト(そこにあるAのインスタンス)に取り組んでいます。クラスBが欲しいのですが、これはほとんど(つまり、すべてのメソッドが同じではない)同じ動作をしますが、異なるクラスのオブジェクト(そこにあるB)で動作しています。

これが私が試したことです:

#include <iostream>
#include <vector>

class A
{
public:
    virtual void perform() { data.push_back(A()); };
    std::vector<A> data;
};


class B : protected A
{
public:
    B() : A() {}
    void test() { perform(); }
    std::vector<B> data;
};


int main()
{
    B b;
    b.test();
    std::cout << b.data.size() << std::endl;
}


// output: 0
// I expected: 1

BはBのサブクラスであるためstd::vector<B>、挿入時にの代わりに使用されることを期待していました。std::vector<A>

私は何が欠けていますか?クラスAで定義されたすべてのメソッドがクラスBで期待どおりに機能することを確認する方法はありますか?

ありがとう!

4

2 に答える 2

3

C++ の継承ベースのポリモーフィズムは関数のみを扱い、データ要素は扱いません。つまり、オブジェクトの型を変更しても、呼び出される関数にのみ影響し、使用されるデータ要素には影響しません。

Aまた、タイプのオブジェクトをのコンテナに割り当てることはできませんB。ポリモーフィズムを無視すると、次のことはできません。

std::vector<B> data;
data.push_back(A());

これは、 が からB継承されているためAであり、その逆ではないためです。

第 3 に、代入では、完全なオブジェクトではなく、ポインターを使用する必要があります。したがって、次のようにする必要があります。

std::vector<A*> data;
data.push_back(new B);
于 2013-03-19T15:55:51.320 に答える
0

異なるタイプで同じ動作が必要な場合は、テンプレートを使用します。

template <typename Element>
class Container
{
public:
    void perform() { data.push_back(Element()); };
    std::vector<Element> data;
};

int main(){
    Container<A> a;
    Container<B> b;
    a.perform();
    b.perform();
    std::cout << a.data.size() << std::endl;
    std::cout << b.data.size() << std::endl;
}

免責事項: コンパイルはテストされていません

于 2013-03-19T15:39:41.110 に答える