【发布时间】:2021-11-02 20:02:06
【问题描述】:
我遇到了一个特殊的 C++ 继承问题。假设我们有两个抽象类,一个使用另一个作为纯虚函数之一的参数类型:
class Food {
public:
int calories=0;
virtual void set_calories(int cal)=0;
}
class Animal {
public:
int eaten_calories=0;
virtual void eat_food(Food &f)=0;
}
现在,我们为每个类创建一个派生类,我们用派生类类型的参数实例化一个虚函数:
class Vegetables: public Food{
public:
void set_calories(int cal){calories=cal;}
}
class Cow: public Animal{
public:
void eat_food(Vegetables &v){this->eaten_calories += v.calories;}
}
这个问题是函数eat_food需要一个抽象类Food的签名,否则Cow()对象创建将无法编译,抱怨Cow是一个抽象类,因为没有合适的找到了eat_food(Food f) 的实现。
更新:我寻求实现的另一个限制是第二个class Meat: public Food 不应该与Cow::eat_food(f) 一起使用。简而言之,仅设置 Cow::eat_food(Food f) 并强制转换为 Vegetables 不会成功。
克服此错误的最佳方法是什么?
到目前为止,我找到了两个选择:
- 在
Cow中使用try/catch创建eat_food(Food f)实现,以检查f是否可以安全地转换为Vegetables,然后调用eat_food(Vegetables v)。 问题:如果你有 50 个虚函数,这将迫使你在Cow中编写 50 个额外的函数实现。 - 将
Animal转换为模板类Animal<T>,并使用Food的每个派生类对其进行实例化以定义动物(例如class Cow: public Animal<Vegetables>)。 问题:您不能再定义Animal*指针来保存类型未知的未定义动物。
这两者有什么可行/时尚的替代品吗?也许是某种软件模式?
【问题讨论】:
标签: c++ inheritance design-patterns abstract-class virtual-functions