将点之间的 "dynamic_cast" 转换为 类

Convert by "dynamic_cast" between points to classes

我尝试按以下方式通过 "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;
}

我收到错误消息:

ERROR1: 'Shape' is an inaccessible base of 'Circle'

ERROR2: cannot dynamic_cast 'sh' (of type 'class Shape*') to type 'class Square*' (source type is not polymorphic)

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

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

第二个错误是因为 class 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);
  • 多态性需要指向基 class 的指针以及虚函数和运算符重载。

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

例如:

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

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