当中间类跳过实现时,在继承层次结构中执行哪种虚拟方法

Which virtual method is executed in an inheritance hierarchy when intermediate classes skip the implementation?

本文关键字:执行 层次结构 方法 虚拟 继承 中间 实现      更新时间:2023-10-16

我敢肯定有人以前问了这个问题,但我根本不知道该搜索什么。因此,一旦有人将我指向一个类似问题,我很高兴立即删除这个问题。如果有人有更好的建议,我也很乐意重命名问题: - (

我想知道以下代码是否由标准定义了行为,或者这可能是编译器/平台依赖性的:

struct A
{
    virtual void f()
    {
        std::cout << "A::f()" << std::endl;
    }
};
struct B : public A
{
    // f() is not implemented here
};
struct C : public B
{
    virtual void f() override
    {
        B::f(); // call f() of direct base class although it is not implemented there
        std::cout << "C::f()" << std::endl;
    }
};
int main()
{
    A* pA = new C();
    pA->f();
}

Visual Studio 2017和GCC 5.4.0的输出是:

A::f()
C::f()

编译器确实会在层次结构中向上搜索直到找到实现?您可以链接到C 标准吗?我已经通过在纯虚拟的情况下制作f((来对其进行测试,并且链接器很好地告诉我,有一个未解决的符号。我可以依靠吗?

我理解使用示波器操作员,例如b :: f((总是调用非虚拟版本。因此,从未发生过多态性,是吗?

edit :误导性的打印语句,用" c :: f(("替换为" b :: f(("。

指针的动态类型

A* pA = new C();

C *

因此,C类中的虚拟函数称为

struct C : public B
{
    virtual void f() override
    {
        B::f(); // call f() of direct base class although it is not implemented there
        std::cout << "B::f()" << std::endl;
    }
};

B类并未重新定义基类A的虚拟功能。因此,在此语句中

        B::f(); // call f() of direct base class although it is not implemented there

a类中定义的虚拟函数称为。那是B类虚拟函数的指针表,其中包含a。

中定义的函数

在此呼叫中

B::f();

可以访问B类虚拟函数表,并且该表包含a类函数定义的地址,因为该函数在b。

类中并未超过。

来自C 标准(5.2.2功能调用(

  1. ...如果所选函数是非虚拟的,或者类成员访问表达式中的ID-Exprivese是合格的ID,则该功能 叫做。否则,其最终的Overrider(10.3(在动态类型中 对象表达式称为;这样的电话称为 虚拟功能调用。[