C++ 动态类型 - 覆盖方法

标签 c++ subclassing overriding

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

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/

相关文章:

c++ - 定义 typedef 的可变参数模板(使用 C++11)

c++ - 迭代 DFS 与递归 DFS 和不同的元素顺序

c++ - 按下键时停止 C++ 中的无限循环

c++ - 编译后更改 Linux 共享库(.so 文件)版本

tensorflow - 是否有 L-BFGS 的 tf.keras.optimizers 实现?

java - 方法不明确 - Java

java - 无法覆盖通用接口(interface)

java - 为什么没有 OutOfMemoryError 子类?

ruby-on-rails - Rails 中的子类化模型

Java 转换、覆盖和多态性