1

从一开始,C++ 中的一些概念(例如虚函数)就一直在我的脑海中玩耍。我已经阅读了一些虚函数的语法,但我永远无法理解 -

  1. 虚函数有什么作用
  2. 为什么使用它们?我的意思是实际上
  3. 为什么我们需要它们?我们不能用普通函数代替吗?
  4. 任何人都可以解释声明以下函数的用途吗?

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

1 回答 1

12
#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"
}

如果您不喜欢多态和派生,那么虚函数就没那么有趣了。如您所见,在第三种情况下, B 的实例是通过 type 的指针访问的A*。对于非虚函数,这意味着调用的函数实际上是在 中定义的A,而不是在 中B。虚函数调用是用一张表来解析的,所以运行时的代码决定了跳转到哪里。

对于您的问题:

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

2) 多态性

3) 不,ap->X()如果A::X()不是因为virtual.

4) 高兴地:

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

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

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

于 2013-09-30T05:13:51.563 回答