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

时间:2015-02-27 01:44:09

标签: c++ inheritance

我来自Java背景,其中扩展(继承)其他类的类通常作为超类传递。我希望在C ++中做类似的事情,但我以前从未使用过C ++继承。我目前有以下内容:

class Obstacle{
    double get_position(){return position;}
};

class Wall : public Obstacle {
    double get_normal(){return normal;}
};

一般来说,障碍物可以是任何形状,但是墙壁是矩形的,因此具有易于设计的法线,这对于大多数障碍物来说都是不合适的。但是,另一个类具有聚合std::vector<Obstacle*>,其中包含所有障碍。当迭代这些障碍并进行计算时,我需要对不同类型的障碍物进行单独的计算(在超类中也有get_type()函数)。当我有一个Wall时,我希望能够调用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 ++中是否可行?我必须创建一个构造函数吗?提前致谢。抱歉,我缺乏理解。

2 个答案:

答案 0 :(得分:2)

static_cast<Wall>(current_obstacle)->get_normal()

尝试

static_cast<Wall*>(current_obstacle)->get_normal()

答案 1 :(得分:2)

首先,如果current_obstacle的类型为Obstacle*,那么您应该将其投射到Wall*。目前,您正在尝试将指针转换为新对象,但这不起作用。

其次,请考虑使用dynamic_cast代替static_cast。这将检查指向的对象是否真的是Wall类型,如果没有,将返回空指针。 static_cast未检查,如果您的Obstacle*没有真正指向Wall,但您投了Wall,则会发生未定义的行为(读取:错误的事情)成员函数。 (正如您所知,在Java中进行转换总是为您执行此检查。)