假设我有一个类动物和一个继承动物的类狗。假设我想调用一个特定于狗的名为 'eat()' 的方法,但所有动物之间有一些共享的吃代码,所以我知道我可以将 'eat()' 设为虚拟但它不会使用基类代码,例如,我是否应该只调用我的基类“eatAll()”,然后特定动物的每个吃方法都必须调用它?我只是在寻找最好的设计。这是在 C++ 中
问问题
162 次
3 回答
5
这是经典的模板方法模式。基本上:
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()
。
于 2012-10-09T19:35:47.627 回答
4
我建议你的基类接口有钩子来调用派生类型的特定功能。这称为模板方法模式。 这是一个例子:
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";
}
};
于 2012-10-09T19:36:37.207 回答
2
只需调用基类的方法。
class Dog : public Animal
{
public :
void Eat()
{
// .. MAGIC
Animal::Eat();
}
};
请注意,如果您的 Animal 类的Eat
方法是纯虚拟的(我对此表示怀疑),则不会链接。
于 2012-10-09T19:35:26.093 回答