gpt4 book ai didi

c++ - 当中间类跳过实现时,在继承层次结构中执行哪个虚方法?

转载 作者:行者123 更新时间:2023-11-30 02:20:26 25 4
gpt4 key购买 nike

我确定之前有人问过这个问题,但我只是不知道要搜索什么。因此,一旦有人向我指出类似问题,我很乐意删除此问题。如果有人有更好的建议,我也很乐意重命名问题:-)

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

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++ 标准吗?我已经通过在 A pure virtual 中制作 f() 来测试它,链接器很好地告诉我有一个未解析的符号。我可以依靠它吗?

据我所知,使用像 B::f() 这样的范围运算符总是调用非虚拟版本。所以从来没有发生过多态性,是吗?

编辑:误导性的打印语句将“B::f()”替换为“C::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. ...If the selected function is non-virtual, or if the id-expression in the class member access expression is a qualified-id, that function is called. Otherwise, its final overrider (10.3) in the dynamic type of the object expression is called; such a call is referred to as a virtual function call. [

关于c++ - 当中间类跳过实现时,在继承层次结构中执行哪个虚方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49672744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com