【发布时间】:2020-01-08 21:57:55
【问题描述】:
我做了以下 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 中,当我调用 Parent2 的函数 z 时,它改为调用子类的函数 h。为什么会这样?
以下是main 函数:
int main()
{
Child obj;
Parent2 * p2 = (Parent2*)(Parent1*)&obj;
p2->z();
return 0;
}
【问题讨论】:
-
您正在调用未定义的行为,因为您无法从
Parent1*转换为Parent2*,只需摆脱(Parent1*)。 (实际上你不需要任何演员,这是隐式完成的)。 -
@n314159 我真的很想知道为什么会这样?
-
事实上,在这种情况下,我相信
dynamic_cast会正常工作并做你想做的事。 -
@Paul 对于这样的上调,
static_cast绰绰有余(甚至会为这种错误抛出一个很好的错误!ideone.com/cNKWUc) -
@AqleemaSajid 之所以发生这种情况,是因为您使用了不安全的 C 风格转换,在这种情况下会进行不正确的对话并且不会警告您。这也是推荐使用适当的 C++ 强制转换的主要原因之一。
标签: c++ pointers inheritance multiple-inheritance