所以假设我有一个由动物园类管理的动物类。
Animal is an abstract class to be derived by other real animal classes
class Animal{
public:
Animal();
virtual ~Animal() = 0;
//Various animal related functions
}
class Zoo{
public:
Zoo();
virtual ~Zoo();
virtual void updateAll();
//And various other functions dealing with animals
private:
vector<animal*> animals
}
现在说我要创建一个bird_zoo,我想重用大部分代码 用于Zoo类和Animal类。
所以我做了鸟类
class Bird : public Animal{
public:
Bird();
virtual ~Bird();
//all the various functions derived from Animal class
virtual void fly(); //New function that Animal didn't have
}
class Bird_Zoo : public Zoo{
public:
Bird_Zoo();
virtual ~Bird_Zoo();
//And various other functions dealing with animals, derived from Zoo
virtual void flyAll(); //New function that Zoo didn't have
private:
//vector<??????> birds
}
我如何与它拥有的Bird_Zoo
函数交易?
如果我与Zoo类中的vector<Animal*>
保持联系,我该如何调用fly()
?
我真的每次都要把它投到Bird*
吗?
有没有办法从概念上“重载”vector<Animal*>
为vector<Bird*>
,
这样所有旧的Zoo功能仍能正常工作吗?
谢谢。
答案 0 :(得分:2)
另一种可能性是使用模板。
class Zoo {
// ...
virtual void updateAll() = 0;
};
template <typename T,
typename = typename enable_if<is_base_of<Animal, T>::value>::type>
class ZooWithAVector : public AbstractZoo {
public:
virtual void updateAll() { /* ... */ }
// Various functions dealing with T-animals
private:
vector<T*> animals;
};
typedef ZooWithAVector<Animal> TypicalZoo;
class BirdZoo : public ZooWithAVector<Bird> {
virtual void flyAll() { /* work with the vector<Bird> */ }
};
答案 1 :(得分:1)
我建议您在vector<animal*>
中没有Zoo
成员。基类(尤其是抽象类)应该只实现所有潜在派生类的共同点。
相反,你可以有一个General_Zoo
扩展Zoo
类,它可以处理所有类型的动物。因此,General_Zoo
将是Bird_Zoo
的兄弟级别。
答案 2 :(得分:1)
您的设计有问题。从理论上讲,您认为Bird_Zoo
是-a Zoo
。它是。但不是你建模的方式。
您可以在设计中看到Zoo
包含任何类型Animal
的集合,而Bird_Zoo
则不包含Bird_Zoo
。因此,如果您选择对此进行建模,则Zoo
不再是vector<Animal*>
。
您可以不为此使用继承,或者,我会做什么,从基类中删除{{1}}。