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()
会覆盖-没有编译器错误。答案 0 :(得分:3)
方法create()
在基类中定义。为了覆盖派生类中的方法,方法签名必须相同。但是这里的事情是返回类型不包括在方法签名中。这就是为什么您看到呼叫sp->create()
的返回类型仍为Shape *
类型的原因。