【问题标题】:What's the difference between Virtual functions and normal functions? [duplicate]虚函数和普通函数有什么区别? [复制]
【发布时间】:2013-09-30 05:00:14
【问题描述】:

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

  1. 虚函数有什么作用
  2. 为什么要使用它们?我的意思是实际上
  3. 我们为什么需要它们?不能用普通函数代替吗?
  4. 谁能解释一下下面的函数是为了什么而声明的?

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

【问题讨论】:

  • @Blastfurnace 甚至没有关闭。
  • 关于 SO 有很多问题解释什么是虚函数,它们是如何使用的,以及这些声明的含义。您有更具体的问题吗?
  • 我的问题很具体,我问过代码块中给出的三个函数有什么区别。
  • 我链接的维基百科条目回答了所有这些问题。

标签: c++ virtual-functions


【解决方案1】:
#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 的实例是通过A* 类型的指针访问的。对于非虚函数,这意味着调用的函数实际上是在A 中定义的,而不是在B 中。虚函数调用通过表格解析,因此代码在运行时决定跳转到哪里。

对于您的问题:

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

2) 多态性

3) 不,因为如果不是 virtualap-&gt;X() 会调用 A::X()

4) 很高兴:

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

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

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

【讨论】:

  • 非常感谢。信息量很大。
  • 如果您有更多问题,请提出。 Virtual函数没那么好理解……
  • @thriqon 添加纯虚方法需要子类来提供纯虚方法的实现是否正确,而其他两个则不需要? C++ 的“接口”?
  • @johnny 是的,您对纯虚拟方法的强制实现是正确的。
猜你喜欢
  • 2011-06-16
  • 2014-04-08
  • 1970-01-01
  • 2016-11-26
  • 2021-06-01
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多