c++ - C++意外调用继承类的函数
问题描述
我做了以下3节课:
struct Parent1
{
virtual void f()
{
cout << "\nParent1::f";
}
};
struct Parent2
{
virtual void g()
{
cout << "\nParent2::g";
}
virtual void z()
{
cout << "\nParent2::z";
}
};
struct Child : public Parent1, public Parent2
{
virtual void h()
{
cout << "\nChild::h";
}
};
在 main 中,当我调用函数z
时Parent2
,它改为调用h
子类的函数。为什么会这样?以下是main
函数:
int main()
{
Child obj;
Parent2 * p2 = (Parent2*)(Parent1*)&obj;
p2->z();
return 0;
}
解决方案
从&obj
ieChild*
到的第一个显式转换Parent1*
是向上转换。结果将指向基类子对象。下一个显式转换是 fromParent1*
到Parent2*
。由于这些类没有直接关系,因此这是一个重新解释。但是类型不是指针互转换的,所以当你通过重新解释的指针调用函数时,程序的行为是不确定的。
你应该避免使用 C 风格的强制转换来防止这样的错误。在这种情况下,根本不需要显式转换。这可以正常工作:
Parent2 * p2 = &obj;
并且永远不要重新解释指针,除非您知道它的含义并且可以这样做。
推荐阅读
- firebase - Flutter:未处理的异常:错误状态:DocumentSnapshotPlatform中不存在字段
- json - 使用带有过滤器和附加列的 pyspark 将 CSV 转换为 JSON
- asp.net-core - 生成ServiceWorkerAssetsManifest Blazor
- list - 在不使用列表理解的情况下获取 Haskell 中列表的所有组合
- python - 如何使用 Pip 强制安装包?
- javascript - 如何在 [disabled] 属性中有条件?
- python - 如何在 python setup.py 中使用方括号安装依赖项?
- php - Laravel如何通过ajax按名称或ID搜索在前端仅显示用户帐户的附加患者
- html - 为什么即使您将边距设置为 0px,CSS 也会在按钮之间放置间距
- arrays - 指向结构中数组的指针