首页 > 解决方案 > 向下转换非多态类型?

问题描述

请考虑以下 C++20 程序:

struct B { B(); private: int whatever; }; // non-aggregate
struct D : B { D(); int x; private: int whatever2; }; // non-aggregate

int main() {
   D* d = new D;
   d->x = 42;
   B* b = (B*) d;
   D* d2 = (D*) b;
   return d2->x;
}

该程序是否格式错误或具有未定义的行为?

也就是说,是否允许将指向非多态类型派生对象的基子对象的指针转换为指向派生对象本身的指针?

如果是这样,其中一个*_cast<T>功能会比 C 风格的演员更合适吗?

(此外,如果指针指向的B对象不是 type 对象的基本子对象D,那么它的行为未定义,对吗?实现无法检查转换是否正确,就像使用dynamic_cast?)

标签: c++c++20

解决方案


该程序是否格式错误或具有未定义的行为?

这个程序的格式很好。您可以将指针从基类型转换为子类型,而不会出现任何问题。

如果是这样,*_cast 函数之一是否比 C 风格的演员更合适?

当然!要使用的默认强制转换是static_cast<T>(...). 它将避免从/向不相关的类型进行转换,这些类型会导致未定义的行为。

例如,即使BD不相关,C 风格的强制转换也会接受您的代码,但使用 static_cast 拒绝代码


推荐阅读