非虚拟重载成员函数

时间:2017-01-12 14:28:48

标签: c++ overloading

此代码

#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

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

3 个答案:

答案 0 :(得分:2)

  

没有使用指针或引用,为什么我需要声明虚函数?

你错了,这段代码:

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

等于:

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

所以使用指针,并且要在运行时解析正确的函数,你必须使用virtual函数。

答案 1 :(得分:1)

如果您未将one声明为虚拟,那么它将在A vtable中没有条目。如果A中没有vtable条目,则表示它所知道的唯一one是它自己的。因此,当您从one致电A::devone时,逻辑上 可以调用的唯一功能是A::one

答案 2 :(得分:0)

它输出“oneA”,因为你正在调用A :: devone(),它又调用A :: one()。
因为A :: one()不是虚拟的,即使你有一个B实例,也会调用基类A类one()方法。

如果你添加

  int devone() {
    one();
  }

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