[C ++意外调用的继承类的函数

问题描述 投票:0回答:1

我完成了以下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。为什么会这样呢?以下是主要功能:

int main()
{
    Child obj;
    Parent2 * p2 = (Parent2*)(Parent1*)&obj;
    p2->z();
    return 0;
}
c++ pointers inheritance multiple-inheritance
1个回答
0
投票

[&obj,即Child*Parent1*的第一个明确转换是上流。结果将指向基类的子对象。下一个显式转换是从Parent1*Parent2*。由于这些类没有直接关系,因此这是重新解释的类型。但是类型不是指针可互换的,因此当您通过重新解释的指针调用该函数时,程序的行为是不确定的。

您应避免使用C样式强制转换,以防止发生此类错误。在这种情况下,根本不需要显式强制转换。这可以正常工作:

Parent2 * p2 = &obj;
© www.soinside.com 2019 - 2024. All rights reserved.