假设我们有以下代码。 我们有以下类:
- Animal作为抽象类
- Dog和Bird是Animal的子类
- Zoo保存了所有动物
_
class Animal
{
public:
Animal();
void HasWings() = 0;
};
class Bird : public Animal
{
public:
Bird() : Animal() {}
void HasWings() override { return true; }
};
class Dog : public Animal
{
public:
Dog() : Animal() {}
void HasWings() override { return false; }
};
class Zoo
{
public:
Zoo() {}
void AddAnimal(Animal* animal) { _animals.push_back(animal); }
...
std::vector<Animal*> _animals;
};
void myTest()
{
Zoo myZoo;
Bird* bird = new Bird();
Dog* dog = new Dog();
myZoo.AddAnimal(bird);
myZoo.AddAnimal(dog);
for (auto animal : myZoo._animals)
{
...
}
...
}
我希望用智能指针的向量代替指针的向量,即:
std::vector<std::shared_ptr<Animal>> _animals;
我们该如何修改Zoo和myTest的代码呢?我在更新代码时遇到了困难,尤其是Zoo类中的"AddAnimal"方法。
auto bird = std::make_shared<Bird>();
auto dog = std::make_shared<Dog>();
myZoo.AddAnimal(bird);
myZoo.AddAnimal(dog);
鸟和狗是不同的种类
AddAnimal(std::shared_ptr<Animal> animal)
-shared_ptr<Bird>
和shared_ptr<Dog>
会转换为shared_ptr<Animal>
,因为前者两个派生自后者。另外,Animal::HasWings
未声明为virtual
,且由于您已经有了一个虚成员函数,因此您可能还应该使Animal
的析构函数成为virtual
。 - Praetorian