想象一下,您有以下课程:
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
};
Run Code Online (Sandbox Code Playgroud)
现在,如果您创建B的实例并调用print:
B * b = new B;
b->print();
Run Code Online (Sandbox Code Playgroud)
这个方法会被虚拟调用吗?换句话说,在编译时或运行时确定要调用的确切方法?
从理论上讲,它可以在编译时确定,因为我们知道,B的子类都不会覆盖该方法,所以无论我分配到指向B的指针B * b = new C; b->print();,它总是会调用B::print().
编译器是否也知道它并使我免于虚拟调用的不必要开销?