0

重複の可能性:
同じ基本クラスを持つ2つのクラスをstd::vectorに格納します

C++での継承に問題があります。ここで、問題を説明するための簡単なコードを作成しました。

//Animal.h
class Animal
{
public:

Animal();
~Animal();

virtual const void Eat();
};

//Bear.h
class Bear: public Animal
{
public:

Animal();
~Animal();

virtual const void Eat();
};

//Animal.cpp
const void Animal::Eat() {
}

//Bear.cpp
const void Animal::Eat() {
 //Do something
}

次に、別のクラスで、動物を保持するベクトルを宣言し、を作成Bearしてベクトルにプッシュします。

std::vector<Animal> a;
Bear b;
a.push_back(b);

問題は、動物のベクトルをトラバースして呼び出しようとするとEat()、基本クラス(動物)のEatメソッドが呼び出されますが、Bear Eatメソッドは呼び出されないことです。

試してみても機能しdynamic_cast itません:dynamic_cast失敗します

dynamic_cast<Bear*>(&a.at(0));

私は何が間違っているのですか?コピーコンストラクタがないからですか?

4

2 に答える 2

4

代わりに、動物(スマート)ポインターを保持するベクトルを作成する必要があります。

オブジェクトのベクトルは、オブジェクトのスライスに悩まされます。

void Animal::Eat()inはタイプミスだBear.cppと思います。そうしないと、コードがコンパイルされません。

またconst void?何も変更しないようにしたいですか?

于 2012-08-20T08:34:19.397 に答える
1

ポリモーフィズムを有効にするには、仮想関数とポインターの 2 つが必要です。ポインタがありません。ではなく、 (または C++11 では std::unique_ptr)std::vectorのベクトルでなければなりません。Animal*Animal

std::vector<Animal*> a;
Bear b;
a.push_back(b);
a[0] -> eat();

次に、くま機能eat()Animal::です。修正してください。

さらに、デストラクタも仮想でなければなりません。デストラクタの呼び出しも多態的でなければなりません。

于 2012-08-20T08:44:47.367 に答える