非虚重载成员函数

Non-virtual overloaded member functions

此代码

#include <iostream>

struct A {
  int one() {
    std::cout << "oneA" << std::endl;
  }
  int devone() {
    one();
  }
};

struct B : A {
  int one() {
    std::cout << "oneB" << std::endl;
  }
};
int main() {
  B b;
  b.devone();
}

打印oneA

我不明白为什么。 我知道如果我使用虚函数 oneB 会被打印出来,但为什么上面的代码示例中没有。没有使用指针或引用,为什么我需要声明函数虚拟?

No pointers or references are used, why do I need to declare the function virtual?

你错了,这段代码:

 int A::devone() {
     one();
 }

等于:

int A::devone() {
  this->one();
}

因此使用了指针,要在运行时解析正确的函数,您必须使用 virtual 函数。

如果您没有将 one 声明为虚拟的,那么它将不会在 A 的 vtable 中有一个条目。如果 A 中没有 vtable 条目,这意味着它唯一知道的 one 是它自己的。因此,当您从 A::devone 调用 one 时,逻辑上它 可以 调用的唯一函数是 A::one.

它输出 "oneA" 因为你正在调用 A::devone(),后者又调用 A::one()。
因为 A::one() 不是虚拟的,即使你有一个 B 实例,基础 A class one() 方法仍然会被调用。

如果你添加

  int devone() {
    one();
  }

到 B class,将调用 B::one() 方法。