在不使用虚函数的情况下用C++覆盖对基类的调用?

Hoo*_*ked 2 c++ inheritance overriding

给定基类A,A::getA::add定义和函数.

class A { 
public:
  int get() { return 3; }
  int add() {
    return get() + get();
  }
};
Run Code Online (Sandbox Code Playgroud)

请注意A::add电话A::get.派生类是否B可以调用A::add但使用它自己的B::get函数?就像是:

class B : public A {
  int get() { return 7; }
};

#include <iostream>

int main() {
  A foo;
  std::cout << foo.add() << std::endl;

  B bar;
  std::cout << bar.add() << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

预期输出14不在6第二种情况下.如果有控制权A,我可以创建::get一个虚函数,每个派生类都可以根据需要实现它.但是,假设这A是不可变的 - 我该如何调用正确的::get

das*_*ght 5

不,这是不可能的:想象一下,它A是单独编译的,并作为预编译库提供给您,以了解原因.

由于A::get不是虚拟的,编译器直接将调用插入到其输出中A::get,而没有通过vtable的任何间接A::add.此外,编译器甚至可以内联调用,如果它选择这样做,"烘焙"返回3其输出.