gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:06:42 26 4
gpt4 key购买 nike

我做了以下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";
}
};

总的来说,当我调用 zParent2函数时,它会调用子类的 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++意外调用继承类的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59654382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com