![](/img/trans.png)
[英]How do I change the class of an object to a subclass of its current class in 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.