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

时间:2013-09-30 05:00:14

标签: c++ virtual-functions

从一开始,C ++中很少有像虚拟函数这样的概念一直在玩。我已经阅读了一些虚函数的语法,但我永远无法理解 -

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

    void MakeMeASandwich();
    
    virtual void MakeMeASandwich();
    
    virtual void MakeMeASandwich() = 0;
    

1 个答案:

答案 0 :(得分: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"
}

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

问题:

1)在运行时确定要调用的函数,具体取决于对象的 real 类型。

2)多态

3)否,如果不是ap->X(),则A::X()会调用virtual

4)很高兴:

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

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

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