【发布时间】:2014-04-04 09:17:36
【问题描述】:
假设我有一个基类fruit和三个派生类Apple、orange和mango。现在我只想在Apple类中定义一个成员函数“taste”。那我该怎么做呢? 是否有必要在基类和所有派生类中定义它或者我只能在一个所需的类中定义它,即苹果 我必须为此使用虚函数吗
感谢和问候
【问题讨论】:
标签: c++ subclass virtual-functions base-class
假设我有一个基类fruit和三个派生类Apple、orange和mango。现在我只想在Apple类中定义一个成员函数“taste”。那我该怎么做呢? 是否有必要在基类和所有派生类中定义它或者我只能在一个所需的类中定义它,即苹果 我必须为此使用虚函数吗
感谢和问候
【问题讨论】:
标签: c++ subclass virtual-functions base-class
您不必在基类中定义它。但是,您将无法在基类指针或引用上调用此方法。该函数不需要是虚拟的。
class Fruit {};
class Apple : public Fruit
{
public:
void Taste();
}
class Orange : public Fruit {}
class Mango : public Fruit {}
Fruit* f = new Apple();
f->Taste(); // Error
Apple* a = new Apple();
a->Taste() // Ok
但是,如果您想从基类指针或引用访问该方法,则需要在基类中定义一个虚方法的空实现并在 Apple 类中覆盖它。
class Fruit
{
public:
virtual void Taste() {}
};
class Apple : public Fruit
{
public:
virtual void Taste()
{
// Do something.
}
}
class Orange : public Fruit {}
class Mango : public Fruit {}
Fruit* f = new Apple();
f->Taste(); // Ok
Fruit* f2 = new Orange();
f2->Taste(); // Ok and no side effect.
【讨论】:
virtual void Taste() = 0;
在一般设计模式中,应将类行为和质量作为模式添加到称为 taset 的不同子类中。
这是鸭子的一个很好的例子,这也适用于你的水果
http://www.cs.colorado.edu/~kena/classes/5448/f09/lectures/16-introdesignpatterns.pdf
【讨论】: