下调非多态类型? 请考虑以下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; }
此程序是否格式错误或行为不明确 也就是说,是否允许将指向非多态类型的派生对象的基子对象的指针强制转换为指向派生对象本身的指针 如果是这样,是否有一个下调非多态类型? 请考虑以下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; },c++,c++20,C++,C++20,此程序是否格式错误或行为不明确 也就是说,是否允许将指向非多态类型的派生对象的基子对象的指针强制转换为指向派生对象本身的指针 如果是这样,是否有一个*\u cast函数比C样式cast更合适 (另外,如果指针指向的B对象不是D类型的对象的基本子对象,那么它的未定义行为,对吗?实现无法检查强制转换是否正确,就像对动态\u强制转换一样?) 此程序是否格式错误或行为不明确 这个计划的形式很好。您可以将指针从基类型强制转换为子类型,而不会出现任何问题 如果是这样,其中一个*_cast函数是否比C样式的c
*\u cast
函数比C样式cast更合适
(另外,如果指针指向的B
对象不是D
类型的对象的基本子对象,那么它的未定义行为,对吗?实现无法检查强制转换是否正确,就像对动态\u强制转换一样
?)
此程序是否格式错误或行为不明确
这个计划的形式很好。您可以将指针从基类型强制转换为子类型,而不会出现任何问题
如果是这样,其中一个*_cast函数是否比C样式的cast更合适
当然可以!要使用的默认强制转换是静态强制转换(…)
。它将避免从/转换到不相关的类型,从而导致未定义的行为
例如,C样式强制转换将接受您的代码,但将D*指定给B*很好——您甚至不需要强制转换:
B*B=D
。从B向D转换,你确实需要一个转换。至于哪种转换形式,如果你知道你的B是一个D,则代码> D*D2= StistalyCase[B,< /C> >将是首选的C++方式。如果您不确定,D*d2=dynamic_cast(b)
将按预期执行强制转换,如果b
是D*
,或者如果不是,它将生成空指针。注意,dynamic\u cast
会产生一些运行时成本。@Perette您不能对非虚拟类型执行dynamic\u cast
。但是剩下的部分你是对的,static\u cast
是首选方式。C风格依赖于重新解释。注意,有一种情况下,C风格做了一些动态和静态不会做的事情,不是UB,也不是重新解释。