gpt4 book ai didi

c++ - 即使没有子类重写一个方法,它也会被虚拟调用吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:23 25 4
gpt4 key购买 nike

假设您有以下类:

class A {
public:
virtual void print() { printf("A\n"); }
};
class B : public A {
public:
virtual void print() override { printf("B\n"); }
};
class C : public B {
// no override of print
};

现在,如果您创建 B 的实例并调用 print:

B * b = new B;
b->print();

这个方法会被虚调用吗?换言之,具体调用的方法是在编译时还是运行时确定的?

理论上它可以在编译时确定,因为我们知道,B 的子类都不会覆盖该方法,所以无论我将什么分配给指向 B 的指针 B * b = new C; b->print();,它总是调用B::print()

编译器是否也知道它并使我免于虚拟调用的不必要开销?

最佳答案

Theoretically it can be determined at compile-time, because we know, that none of sub-classes of B overrides that method

在一般情况下,您无法在编译时确定这一点,因为 C++ 编译器一次处理一个翻译单元。来自不同翻译单元的类,例如 class D : public B 可以覆盖该方法。但是,在翻译对 b->print() 的调用时,编译器可能无法看到 class D 的翻译单元,因此编译器必须假设虚拟通话。

为了解决这个缺点,C++11引入了final keyword ,这让程序员可以告诉编译器,从这个层次的继承层次结构中不会有进一步的覆盖。现在编译器可以优化虚拟调用,并强制执行不再覆盖的要求。

关于c++ - 即使没有子类重写一个方法,它也会被虚拟调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36556141/

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