C++意外调用继承类的函数
C++ unexpected calling of function of inherited classes
我做了以下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";
}
};
总的来说,当我调用Parent2
的函数z
时,它反而调用子类的函数h
。为什么会这样? 以下是main
函数:
int main()
{
Child obj;
Parent2 * p2 = (Parent2*)(Parent1*)&obj;
p2->z();
return 0;
}
从&obj
的第一个显式转换,即Child*
Parent1*
是一个上升。结果将指向基类子对象。下一个显式转换是从Parent1*
到Parent2*
。由于这些类没有直接关系,因此这是一个重新解释的转换。但是这些类型不是指针可相互转换的,因此当您通过重新解释的指针调用函数时,程序的行为是未定义的。
应避免使用 C 样式转换以防止此类错误。在这种情况下,根本不需要显式强制转换。这工作正常:
Parent2 * p2 = &obj;
永远不要重新解释指针,除非你知道它的含义并且这样做是可以的。
相关文章:
- C++虚函数继承
- 名称隐藏对静态函数继承的实例使用
- C++ std::vector 中的虚拟析构函数继承
- 具有相同名称的类的构造函数继承
- 多复制构造函数继承中的惊人行为
- CRTP 和复制/移动赋值/构造函数继承
- 复制构造函数继承动态分配的数组
- 谷神星求解器成本函数继承错误:模板可能不是虚拟的
- 无法从 c++ 中的构造函数继承
- 在构造函数继承中使用默认构造函数
- 如何定义从虚拟函数继承的静态函数
- 调用超类函数继承 c++
- 构造函数继承和直接成员初始化
- c++ 不明确的双非虚函数继承
- C++ - 使用私有参数的构造函数继承
- 通过可变参数模板进行C++11构造函数继承
- 使用模板进行函数继承
- C++11构造函数继承和不带参数的构造函数
- 函数继承问题
- C++11 - 构造函数继承