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

els*_*ooo 0 c++ overriding subclassing

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

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

string Fruit::color() {
    return "Unkown";
};

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

string Apple::color() {
    return "Green";
};
Run Code Online (Sandbox Code Playgroud)

现在,你称之为:

Apple *apple = new Apple();
std::cout << apple->color();
Run Code Online (Sandbox Code Playgroud)

这将输出Green,这是正确的!但是,在以下情况下运行它(当然这只是一个例子):

Apple *apple = new Apple();
printHealthy(apple);

// Method printHealthy:

void printHealthy(Fruit *fruit) {
    std::cout << fruit->color();
};
Run Code Online (Sandbox Code Playgroud)

这将输出Unkown,我可以理解,因为你将Apple转换为Fruit,从而'替换'它的方法.但我怎么还能了解它的真实颜色呢?
要求:

  • 我需要知道它的真实颜色是什么.
  • 我不能依赖于Apple--class.将会有更多Apple的东西,在旅途中分配.
  • 每个Apple类(例如Tomato,它们当然有不同的名称)是它的子类Fruit.
  • 并非每个类都实现所有方法.例如,可能存在Apple哪种颜色 "未知",因此它不会覆盖该方法,而是运行Fruit方法.

lin*_*r27 7

virtual在基类中标记函数.

class Fruit {
public:
    virtual string color();
};
Run Code Online (Sandbox Code Playgroud)


Pup*_*ppy 5

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