我尝试按以下方式转换为“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 *'(源类型不是多态的)
有人可以解释我为什么会收到这些错误吗?
答案 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
不是多态的,上面的行也能正常工作。