检查派生类类型

use*_*867 1 c++ derived-class

这是我在设计界面时遇到的问题的一个例子.

我有一个动物类,我从中获得了猫,狗和狮子.现在我有一个函数'feedFood',它接受基类Animal作为参数.根据动物的类型,我应该给动物喂食不同的食物.

那么如何在'feedFood'功能中检查动物的类型.

我能想到3种方法

  • 在基类中添加'AnimalType'枚举,该类在派生类中设置为正确的类型.
  • 在基类中添加虚函数以返回具有动物类型的字符串.在派生类中,返回动物名称的正确字符串.
  • 使用typeid或dynamic_cast检查'feedFood'函数中派生类的类型.

哪种方法最好,还是有其他更好的方法?

Ker*_* SB 6

你现在这样说:

void feedFood(Animal &);

Cat myCat;
Dog myDog;

feedFood(myCat);
feedFood(myDog);

// Problem: How does feedFood() know what's going on?
Run Code Online (Sandbox Code Playgroud)

要使用多态,请将feed函数设置为以下虚拟成员Animal:

struct Animal
{
  virtual void feedFood() = 0; // pure virtual or default behaviour, up to you
  virtual ~Animal() { }        // always provide virtual destructor!
  /* ... */
};

struct Cat : public Animal
{
  void feedFood() { /* Cat implementation */ }
  /* ... */
};

// Usage:

// via reference
void feed(Animal & a) { a.feedFood(); }

// via pointer
Animal * b = new Bat;
b->feedFood();
Run Code Online (Sandbox Code Playgroud)