首页 > 解决方案 > 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 中,当我调用函数zParent2,它改为调用h子类的函数。为什么会这样?以下是main函数:

int main()
{
    Child obj;
    Parent2 * p2 = (Parent2*)(Parent1*)&obj;
    p2->z();
    return 0;
}

标签: c++pointersinheritancemultiple-inheritance

解决方案


&objieChild*到的第一个显式转换Parent1*是向上转换。结果将指向基类子对象。下一个显式转换是 fromParent1*Parent2*。由于这些类没有直接关系,因此这是一个重新解释。但是类型不是指针互转换的,所以当你通过重新解释的指针调用函数时,程序的行为是不确定的。

你应该避免使用 C 风格的强制转换来防止这样的错误。在这种情况下,根本不需要显式转换。这可以正常工作:

Parent2 * p2 = &obj;

并且永远不要重新解释指针,除非您知道它的含义并且可以这样做。


推荐阅读