0

假设我有一个类动物和一个继承动物的类狗。假设我想调用一个特定于狗的名为 'eat()' 的方法,但所有动物之间有一些共享的吃代码,所以我知道我可以将 'eat()' 设为虚拟但它不会使用基类代码,例如,我是否应该只调用我的基类“eatAll()”,然后特定动物的每个吃方法都必须调用它?我只是在寻找最好的设计。这是在 C++ 中

4

3 回答 3

5

这是经典的模板方法模式。基本上:

class Animal
{
    void Eat() 
    {
       //stuff specific to all animals

       SpecificEat();
    }
    virtual void SpecificEat() = 0;
};

class Dog : Animal
{
    virtual void SpecificEat()
    {
        //stuff specific to dog
    }
};

使用这种方法,您不必在派生类的覆盖中显式调用基类方法。它由非自动调用virtual Eat(),具体功能由 实现virtual SpecificEat()

于 2012-10-09T19:35:47.627 回答
4

我建议你的基类接口有钩子来调用派生类型的特定功能。这称为模板方法模式。 这是一个例子:

class Animal
{
public:
   void eat()
   {
      std::cout << "Mmmm... It's ";
      do_eat();
   }

private:
   virtual void do_eat() = 0;
};

class Dog
   : public Animal
{
   virtual void do_eat()
   {
      std::cout << "Dog Food!\n";
   }
};

class Human
   : public Animal
{
   virtual void do_eat()
   {
      std::cout << "Pizza!\n";
   }
};
于 2012-10-09T19:36:37.207 回答
2

只需调用基类的方法。

class Dog : public Animal
{
public :
  void Eat()
  {
    // .. MAGIC
    Animal::Eat();
  }
};

请注意,如果您的 Animal 类的Eat方法是纯虚拟的(我对此表示怀疑),则不会链接。

于 2012-10-09T19:35:26.093 回答