c++ - 向下转换非多态类型?
问题描述
请考虑以下 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
?)
解决方案
该程序是否格式错误或具有未定义的行为?
这个程序的格式很好。您可以将指针从基类型转换为子类型,而不会出现任何问题。
如果是这样,*_cast 函数之一是否比 C 风格的演员更合适?
当然!要使用的默认强制转换是static_cast<T>(...)
. 它将避免从/向不相关的类型进行转换,这些类型会导致未定义的行为。
例如,即使B
和D
不相关,C 风格的强制转换也会接受您的代码,但使用 static_cast 拒绝代码
推荐阅读
- git - Git不断复制文件并在文件名末尾附加'2'
- python - 如何根据物品消耗找到物品生命周期?
- mysql - 计划的 MySQL 事件未触发
- java - 如何避免使用 Instanceof 运算符?
- python - 如何为python字典中的每个特定键添加值?(不要更新另一个密钥)
- google-api - 在哪里可以找到 Google API JavaScript 库源代码存储库?
- python - 使用字典理解将 2 个列表转换为字典
- python-3.x - 如何获取所有数字列的“.describe()”统计信息,无论是否嵌套?
- python - 是否可以在 PID 的帮助下找到文件的位置?
- python-3.x - 从数据框中删除标点符号和停用词