将点之间的 "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
不是多态的,上面的行也能正常工作。
我尝试按以下方式通过 "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
不是多态的,上面的行也能正常工作。