C++ 意外调用继承的函数 类
C++ unexpected calling of function of inherited classes
我做了以下 3 classes:
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
时,它会调用子 class 的函数 h
。为什么会这样?
以下是 main
函数:
int main()
{
Child obj;
Parent2 * p2 = (Parent2*)(Parent1*)&obj;
p2->z();
return 0;
}
从 &obj
的第一个显式转换,即 Child*
到 Parent1*
是向上转换。结果将指向基础 class 子对象。下一个显式转换是从 Parent1*
到 Parent2*
。由于这些 classes 没有直接关系,因此这是一个重新解释的演员表。但是类型不是指针可相互转换的,所以当你通过重新解释的指针调用函数时,程序的行为是未定义的。
你应该避免使用 C 风格的转换来防止这样的错误。在这种情况下,根本不需要显式转换。这可以正常工作:
Parent2 * p2 = &obj;
永远不要重新解释指针,除非您知道它的含义并且可以这样做。
我做了以下 3 classes:
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
时,它会调用子 class 的函数 h
。为什么会这样?
以下是 main
函数:
int main()
{
Child obj;
Parent2 * p2 = (Parent2*)(Parent1*)&obj;
p2->z();
return 0;
}
从 &obj
的第一个显式转换,即 Child*
到 Parent1*
是向上转换。结果将指向基础 class 子对象。下一个显式转换是从 Parent1*
到 Parent2*
。由于这些 classes 没有直接关系,因此这是一个重新解释的演员表。但是类型不是指针可相互转换的,所以当你通过重新解释的指针调用函数时,程序的行为是未定义的。
你应该避免使用 C 风格的转换来防止这样的错误。在这种情况下,根本不需要显式转换。这可以正常工作:
Parent2 * p2 = &obj;
永远不要重新解释指针,除非您知道它的含义并且可以这样做。