C ++派生所有者类和子类的类

时间:2012-03-15 19:27:35

标签: c++ oop design-patterns inheritance

所以假设我有一个由动物园类管理的动物类。

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功能仍能正常工作吗?

谢谢。

3 个答案:

答案 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}}。