繁体   English   中英

您如何在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_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()将任何类((Wall)current_obstacle).get_normal()转换为其子类。 在C ++中也可能吗? 我必须创建一个构造函数吗? 提前致谢。 对不起,我缺乏理解。

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

尝试

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

首先,如果current_obstacle的类型为Obstacle* ,则应将其强制转换为Wall* 当前,您正在尝试将指针转换为新对象,这是行不通的。

其次,考虑使用dynamic_cast而不是static_cast 这将检查所指向的对象是否确实为Wall类型,如果不是,则将返回空指针。 如果您的Obstacle*并非真正指向Wall而是您将其static_cast并调用Wall成员函数,则static_cast不会进行检查,并且会发生未定义的行为(读取:错误的事情)。 (众所周知,使用Java进行铸造始终会为您执行此检查。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM