正常覆盖会以这种方式工作:
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();
这将输出Green
,这是正确的!但是,在以下情况下运行它(当然这只是一个例子):
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
的方法。答案 0 :(得分:7)
在基类中标记函数virtual
。
class Fruit {
public:
virtual string color();
};
答案 1 :(得分:5)
你忘记了virtual
。将virtual
关键字添加到color
的声明中,您的代码将打印正确的颜色。 C ++只对声明为virtual
的函数执行动态查找。
答案 2 :(得分:2)
color
方法应该是虚方法。
目前,color
方法不是虚拟的。编译器在编译时决定调用哪个方法。您想要的是在运行时根据类的实际类型执行此操作。