虚函数和普通函数有什么区别?

Leg*_*las 1 c++ virtual-functions

C++中很少有概念,比如虚函数,从一开始就一直在玩我的脑袋.我已经阅读了一些虚函数的语法,但我永远无法理解 -

  1. 什么虚函数
  2. 他们为什么用?我的意思是实际上
  3. 我们为什么需要它们?我们不能使用普通功能吗?
  4. 任何人都可以解释宣布以下函数的内容吗?

    void MakeMeASandwich();
    
    virtual void MakeMeASandwich();
    
    virtual void MakeMeASandwich() = 0;
    
    Run Code Online (Sandbox Code Playgroud)

thr*_*qon 9

#include <iostream>

class A {
  public:
    void Y() { std::cout << "A" << std::endl; }
    virtual void X() { std::cout << "A" << std::endl; }
};

class B : public A {
  public:
    void Y() { std::cout << "B" << std::endl; }
    virtual void X() { std::cout << "B" << std::endl; }
};

int main() {
  A a;
  a.Y(); // "A"
  a.X(); // "A"

  B b;
  b.Y(); // "B"
  b.X(); // "B"

  A* ap = &b;
  ap->Y(); // "A"
  ap->X(); // "B"
}
Run Code Online (Sandbox Code Playgroud)

如果你没有进行多态和派生,虚函数就不那么有趣了.如您所见,在第三种情况下,通过类型指针访问B的实例A*.对于非虚函数,这意味着调用的函数实际上是在A,而不是在B.使用表解析虚函数调用,因此运行时的代码确定跳转的位置.

对你的问题:

1)根据对象的实际类型,在运行时确定要调用哪个函数.

2)多态

3)不,如果不是这样,ap->X()就会打电话.A::X()virtual

4)很高兴:

void MakeMeASandwich(); 默认,没什么特别的.

virtual void MakeMeASandwich();虚函数,提供实现.派生类可以选择覆盖它.

virtuall void MakeMeASandwich() = 0;声明了虚函数,但未提供任何实现.包含此函数的类自动设置为abstract并且无法实例化.