我如何使用继承的方法和相同的基类方法?

时间:2012-10-09 19:32:29

标签: c++ class inheritance virtual

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

3 个答案:

答案 0 :(得分:5)

这是经典的template method pattern。基本上是:

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()实现。

答案 1 :(得分:4)

我建议你的基类接口有钩子来调用派生类型的特定功能。这被称为template method pattern.这是一个例子:

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";
   }
};

答案 2 :(得分:2)

只需调用基类'方法。

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

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