正常的覆盖将以这种方式工作:
class Fruit {
public:
string color();
};
string Fruit::color() {
return "Unkown";
};
class Apple : public Fruit {
public:
string color();
};
string Apple::color() {
return "Green";
};
现在,您可以这样调用它:
Apple *apple = new Apple();
std::cout << apple->color();
这将输出绿色
,这是正确的!但是,在以下情况下运行它(当然这只是一个例子):
Apple *apple = new Apple();
printHealthy(apple);
// Method printHealthy:
void printHealthy(Fruit *fruit) {
std::cout << fruit->color();
};
这将输出 Unkown
,我可以理解,因为您将 Apple 转换为 Fruit,从而“替换”了它的方法。可我如何才能知道它真正的颜色呢?
要求:
- 我需要知道它的真实颜色是什么。
- 我不能依赖
Apple
类。将会有更多的Apple
,这些都是在旅途中分配的。 - 每个
Apple
类(例如Tomato
,它们当然有不同的名称)都是Fruit
的子类。 - 并非每个类都实现所有方法。例如,可能有一个
Apple
的颜色是“未知”,因此它不会覆盖该方法,而是运行Fruit
'方法。
最佳答案
在基类中标记函数virtual
。
class Fruit {
public:
virtual string color();
};
关于C++ 动态类型 - 覆盖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6346250/