This question already has answers here:
Covariant return type and type conversion

(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/

10-11 22:23
查看更多