鉴于以下情况:
结构A
{
常量浮点x;
常量浮动y;
A(浮动x,浮动y)
:x{x},y{y}{
};
B类
{
公众:
B(常数浮动和浮动)
:floating{floating}{}
虚拟浮点foo_x()常量=0;
虚拟浮点foo_y()常量=0;
虚拟A foo()常量
{
返回A(foo_x(),foo_y());
}
受保护的:
常量浮动和浮动;
};
丙类:公共乙类
{
公众:
C(常量整数*整数、常量浮点和浮点)
:B{floating},integer{integer}{
虚拟浮点foo_x()常量重写
{
返回静态_cast<;float>;(*整数)+浮点+1.0f;
}
虚拟浮点foo_y()常量重写
{
返回静态_cast<;float>;(*整数)-浮点-2.0f;
}
私人:
常量int*整数;
};
int main()
{
浮点数F{1.0f};
int I{1};
C对象(&;I,F);
res{object.foo()};
}
foo()的定义有什么问题吗?上面的代码片段产生了预期的结果(resholding3和-2),但是在一个更大的项目中,类似的设置在调用foo()时会产生一些意想不到的结果,同时如果我从C分别调用foo_x()和foo_y(),则会给出正确的输出(很抱歉,我无法以最小的方式复制该错误)
在B中foo()的定义中,我是否通过调用foo\u x()和foo\u y()调用了一些未定义的行为?在我看来,当foo()最终被C调用时,vtable应该得到正确的解析,但也许我遗漏了什么
我是否通过在B中foo()的定义中调用foo_x()和foo_y()来调用一些未定义的行为
不需要。只要满足调用虚拟函数的所有常规先决条件,它就定义得很好,并且按照您期望的方式工作
关于这些前提条件,最容易犯的错误是,在本例中,子类C必须在执行虚拟调用之前完全构造