关于c ++:我如何使用继承的方法和相同的基类方法?

how can I use an inherited method and the same base class method?

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Animal
{
    void Eat()
    {
       //stuff specific to all animals

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

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

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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!
"
;
   }
};

class Human
   : public Animal
{
   virtual void do_eat()
   {
      std::cout <<"Pizza!
"
;
   }
};


只需调用基类的方法。

1
2
3
4
5
6
7
8
9
class Dog : public Animal
{
public :
  void Eat()
  {
    // .. MAGIC
    Animal::Eat();
  }
};

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