未从指向基类的指针调用覆盖方法

时间:2018-06-23 21:05:38

标签: c++

class Shape {
public:
    virtual Shape* create() { return new Shape(); }
    virtual ~Shape() {}
};

class Circle : public Shape {
public:
    virtual Circle* create() override { return new Circle(); }
};

int main() {
    Shape *sp = new Circle();
    Circle *cr = sp->create(); // invalid conversion from ‘Shape*’ to ‘Circle*’
    delete sp;
}

为什么会这样,Circle::create()不应该被叫?

  • 该调用不在构造函数内部。
  • Circle::create()会覆盖-没有编译器错误。

1 个答案:

答案 0 :(得分:3)

方法create()在基类中定义。为了覆盖派生类中的方法,方法签名必须相同。但是这里的事情是返回类型不包括在方法签名中。这就是为什么您看到呼叫sp->create()的返回类型仍为Shape *类型的原因。