如何在 c++ 中将类强制转换为其子类

How do you cast a class to its subclass in c++?

本文关键字:转换 子类 c++      更新时间:2023-10-16

我来自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()