如何在 c++ 中将类强制转换为其子类
How do you cast a class to its subclass in c++?
我来自Java背景,其中扩展(继承(其他类的类通常作为超类传递。我希望在C++做类似的事情,但我以前从未使用过C++继承。我目前有以下内容:
class Obstacle{
double get_position(){return position;}
};
class Wall : public Obstacle {
double get_normal(){return normal;}
};
一般来说,障碍物可以是任何形状,但墙壁是矩形的,因此有一个易于设计的法线,这不适合大多数障碍物。但是,另一个类具有包含所有障碍物的聚合std::vector<Obstacle*>
。在遍历这些障碍并进行计算时,我需要为不同类型的障碍物进行单独的计算(超类中也有一个get_type()
函数(。当我有一堵墙时,我希望能够调用get_normal()
,但是如果我尝试static_cast<Wall>(current_obstacle)->get_normal()
,我会收到编译错误:no matching function call to Wall(Obstacle*&)
。如果我使用 ((Wall)current_obstacle)->get_normal()
,它也会出现相同的错误。似乎我应该创建一个Wall
构造函数,它采用Obstacle
并创建一个新的Wall
对象,但这些对我来说似乎没有意义。
在 Java 中,我可以使用 ((Wall)current_obstacle).get_normal()
将任何类强制转换为其子类。这在C++也可能吗?我必须创建一个构造函数吗?提前谢谢。对不起,我缺乏理解。
首先,如果current_obstacle
的类型是 Obstacle*
,那么你应该将其转换为 Wall*
。当前,您正在尝试将指针转换为新对象,但不起作用。
其次,考虑使用 dynamic_cast
而不是 static_cast
。这将检查指向的对象是否确实是 Wall
类型,如果不是,将返回一个空指针。 static_cast
不会检查,如果您的Obstacle*
并没有真正指向Wall
但您强制转换它并调用 Wall
成员函数,则会发生未定义的行为(阅读:坏事(。(如您所知,Java 中的强制转换始终为您执行此检查。
static_cast<Wall>(current_obstacle)->get_normal()
尝试
static_cast<Wall*>(current_obstacle)->get_normal()
- 将父类对象强制转换为子类的问题
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 无法将模板子类强制转换为其他模板实例化
- 从父类的向量访问子类函数,而无需向下转换
- 带有基类指针的强制转换向量,指向子类
- 将子类的成员函数强制转换为父类
- C++ QList 中项目的 QT 强制转换到子类
- 将"this"从父类方法转换为子类方法是一种好的做法吗?
- 将子类转换为基类
- 无法将参数 3 从 'const QGraphicsItem *' 转换为 'const QObject *',这是指针,对象是 QGraphicsObject 的子类
- C 错误:从(基类模板)到子类的无效转换
- 从子类到具有相同基数的抽象子类的隐式转换
- 子类ConstexPR类以获得不同的用户定义的转换行为
- 如何在模板子类中重写转换运算符C++
- 模板化函数指针从子类到父类的转换
- 无法将超类强制转换为子类
- 将子类列表转换为超类列表
- C++从接口类到子类的转换无效
- 不能转换子类..到其私有基类
- 用简单的操作转换子类向量时得到错误