This question already has answers here:
Covariant return type and type conversion
(2个答案)
2年前关闭。
我有下一个代码
由于Shape不是Circle(向下转换错误),因此代码未编译。
我有点困惑。 create()不是动态绑定(bind)吗?线
不应该返回Circule *?
(2个答案)
2年前关闭。
我有下一个代码
class Shape
{
public:
virtual Shape* create() { return new Shape; }
virtual void print() { cout << "Shape" << endl; }
virtual ~Shape() {}
};
class Circle : public Shape
{
public:
virtual Circle* create() { return new Circle; }
virtual void print() { cout << "Circle" << endl; }
};
void foo ()
{
Shape* sp = new Circle;
Circle* cp = sp->create();
cp->print();
delete sp;
delete cp;
}
由于Shape不是Circle(向下转换错误),因此代码未编译。
我有点困惑。 create()不是动态绑定(bind)吗?线
Circle* cp = sp->create();
不应该返回Circule *?
最佳答案
因为那条线Circle* cp = sp->create();
在编译时由编译器评估。而在编译时,它所知道的只是sp
是指向Shape
的指针,因此Shape::create()
的签名在编译时使用。它无法知道指针指向的内容,因为它是在运行时分配和设置的。要绕过它,请使用dynamic_cast
。Circle* cp = dynamic_cast<Circle*>(sp->create());
关于c++ - 用C++进行向下转换想知道,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52177871/