使用虚函数和重新定义之间的区别

use*_*518 2 c++

重新定义和使用虚拟功能有什么区别?他们不是为了同一个目的吗?您允许派生类的对象在两种情况下都使用相同的名称调用自己的函数版本.那么区别在哪里?

Fat*_*ror 5

一个例子说得最好:

#include <iostream>

using namespace std;

class A {
public:
  virtual void f1() { cout << "Class A" << endl; }
  void f2() { cout << "Class A" << endl; }
  virtual ~A(){}
};

class B : public A {
public:
  virtual void f1() { cout << "Class B" << endl; }
  void f2() { cout << "Class B" << endl; }
  virtual ~B(){}
};

int main()
{
  A *a = new B;
  a->f1();
  a->f2();
}
Run Code Online (Sandbox Code Playgroud)

...

$ ./override 
Class B
Class A
Run Code Online (Sandbox Code Playgroud)

你可以看到,当我们引用B的实例时,f1()仍然会调用它B的版本,但是f2()调用它们A.

当你声明一个虚函数时,你会说当我们调用它时我们应该使用vtable来查找要调用的函数的正确版本,这样你总是可以获得函数的最大派生版本,即使你引用它它作为祖先类型.如果没有虚拟,它将只使用您引用它的类型中的定义.