嵌套虚函数

鉴于以下情况:

结构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(),则会给出正确的输出(很抱歉,我无法以最小的方式复制该错误)

Bfoo()的定义中,我是否通过调用foo\u x()foo\u y()调用了一些未定义的行为?在我看来,当foo()最终被C调用时,vtable应该得到正确的解析,但也许我遗漏了什么

我是否通过在B中foo()的定义中调用foo_x()和foo_y()来调用一些未定义的行为

不需要。只要满足调用虚拟函数的所有常规先决条件,它就定义得很好,并且按照您期望的方式工作

关于这些前提条件,最容易犯的错误是,在本例中,子类C必须在执行虚拟调用之前完全构造

发表评论