【问题标题】:C++ dynamic type - overriding methodsC++ 动态类型 - 覆盖方法
【发布时间】:2011-06-14 15:42:45
【问题描述】:

正常覆盖会这样工作:

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-class。将会有更多的Apple,随时分配。
  • 每个Apple 类(例如Tomato,它们当然有不同的名称)都是Fruit 的子类。
  • 并非每个类都实现所有方法。例如,可能有一个Apple,其颜色为“未知”,因此它不会覆盖该方法,而是运行Fruit 的方法。

【问题讨论】:

    标签: c++ subclassing overriding


    【解决方案1】:

    在基类中标记函数virtual

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

    【讨论】:

    • 非常感谢,它有效:D!作为一名 PHP 和 ObjC 开发人员,我昨天开始学习 C++,它是如此美妙的语言,它结合了 Obj-C 和 PHP 的所有优点!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      color 方法应该是虚拟方法。

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

      【讨论】:

        猜你喜欢
        • 2017-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        • 1970-01-01
        • 1970-01-01
        • 2012-12-21
        相关资源
        最近更新 更多