我来自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 ++中是否可行?我必须创建一个构造函数吗?提前致谢。抱歉,我缺乏理解。
答案 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中进行转换总是为您执行此检查。)