C 继承向下转型

新手上路,请多包涵

我的基类如下:

 class point    //concrete class
{
 ...    //implementation
}

class subpoint : public point  //concrete class
{
...     //implementation
}

如何从点对象转换为子点对象?我已经尝试了以下所有三种方法:

 point a;
subpoint* b = dynamic_cast<subpoint*>(&a);
subpoint* b = (subpoint*)a;
subpoint b = (subpoint)a;

这些演员阵容有什么问题?

原文由 CodeKingPlusPlus 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 533
2 个回答

如何从点对象转换为子点对象?

你不能;除非 point 有一个转换运算符,或者 subpoint 有一个转换构造函数,在这种情况下可以转换对象类型而无需强制转换。

如果引用的对象实际上是 subpoint 类型,您可以从 point _引用_(或指针)转换为 subpoint _引用_(或指针):

 subpoint s;

point & a = s;
subpoint & b1 = static_cast<subpoint&>(a);
subpoint & b2 = dynamic_cast<subpoint&>(a);

第一个( static_cast )更危险;没有检查转换是否有效,所以如果 a 不引用 subpoint ,那么使用 b1 将有未定义的行为。

第二个( dynamic_cast )更安全,但只有在 point 是多态的(即,如果它具有虚函数)时才有效。如果 a 引用了不兼容类型的对象,那么它会抛出异常。

原文由 Mike Seymour 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于第一个示例, dynamic_cast 仅在基类中至少有一个虚拟方法时才有效。如果对象实际上不是您要转换的类型,它将导致 NULL。

对于第二个示例,您需要 &a 而不是 a ,但是一旦您修复了该问题,您将获得未定义的行为,因为对象类型错误。

第三个示例需要 --- 中的 point operator subpoint() 方法在创建副本时进行转换。

原文由 Mark Ransom 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题