这是我在设计接口(interface)时遇到的一个问题示例。

我有一类动物,并且从中衍生了猫,狗和狮子。现在,我有一个函数“feedFood”,该函数将基类Animal作为参数。根据动物的种类,我应该给动物喂不同的食物。

因此,如何在“feedFood”功能中检查动物的类型。

我可以想到3种方法

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

  • 哪个是最佳方法,或者还有其他更好的方法吗?

    最佳答案

    您目前正在这样说:

    void feedFood(Animal &);
    
    Cat myCat;
    Dog myDog;
    
    feedFood(myCat);
    feedFood(myDog);
    
    // Problem: How does feedFood() know what's going on?
    

    要使用多态性,请将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();
    

    10-08 02:10