C++动态类型重写方法

C++ dynamic type - overriding methods

本文关键字:方法 重写 类型 动态 C++      更新时间:2023-10-16

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

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,其颜色"unkown",因此它不会覆盖该方法,而是运行Fruit的方法

在基类中标记函数virtual

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

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

color方法应该是一个虚拟方法。

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