【发布时间】:2015-02-26 02:20:57
【问题描述】:
假设我们有以下代码。我们有以下课程
- 抽象类的动物
- Dog and Bird 是 Animal 的子类
- 饲养所有动物的动物园
_
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
标签: c++ c++11 abstract-class smart-pointers