在点到类之间通过“dynamic_cast”转换

时间:2018-03-17 18:34:42

标签: c++ class casting compiler-errors dynamic-cast

我尝试按以下方式转换为“dynamic_cast”:

#include <iostream>

class Shape {
    //....
};

class Square: Shape {
    //....
};

class Circle: Shape {
    //....
};

int main() {
    Circle cr;
    Shape* sh = &cr; // ERROR1
    Square* psq = dynamic_cast<Square*>(sh); //ERROR2
    return 0;
}

我收到错误消息:

  

错误1:'形状'是'Circle'无法访问的基础

     

ERROR2:不能用dynamic_cast“sh”(类型为'Shape *')来输入'class Square *'(源类型不是多态的)

有人可以解释我为什么会收到这些错误吗?

1 个答案:

答案 0 :(得分:2)

第一个错误是您必须从Shape公开继承才能在派生对象构造中调用Shape的构造函数。

第二个错误是因为类Shape必须是多态的,这意味着至少有一个虚拟方法:

class Shape {
    public:
        virtual ~Shape(){}
    //....
};

class Square: public Shape {
    //....
};

class Circle: public Shape {
};

Circle cr;
Shape* sh = &cr; // ERROR1
Square* psq = dynamic_cast<Square*>(sh);
  • 多态性需要指向基类和虚函数以及运算符重载的指针。

  • 您可以使用dynamic_cast将派生类强制转换为非多态基类。但是你不能dynamic_cast派生类的非多态基础。

例如:

Circle* cr = new Circle;
Shape* shp = dynamic_cast<Shape*>(cr); // upcasting

即使基类Shape不是多态的,上面的行也能正常工作。