C ++动态类型 - 重写方法

时间:2011-06-14 15:42:45

标签: c++ subclassing override

正常覆盖会以这种方式工作:

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的方法。

3 个答案:

答案 0 :(得分:7)

在基类中标记函数virtual

class Fruit {
public:
    virtual string color();
};

答案 1 :(得分:5)

你忘记了virtual。将virtual关键字添加到color声明中,您的代码将打印正确的颜色。 C ++只对声明为virtual的函数执行动态查找。

答案 2 :(得分:2)

color方法应该是虚方法。

目前,color方法不是虚拟的。编译器在编译时决定调用哪个方法。您想要的是在运行时根据类的实际类型执行此操作。