一文带你学习C++中的虚函数

 更新时间:2023年05月10日 08:27:38   作者:码出世界的淡水鱼  
C++中的虚函数是一种非常重要的概念,它允许一个子类重写基类的方法,并确保在调用基类指针或引用的方法时,调用正确的子类方法,本文将介绍C++虚函数的基本概念、语法、使用及其示例,需要的朋友可以参考下

概念

虚函数是一种具有特殊属性的成员函数,它可以被子类重写,并在运行时确定调用哪个方法。为了定义一个虚函数,将在该函数的声明中使用关键字virtual。当调用一个虚函数时,编译器不会立即解析函数的调用,而是使用一个虚函数表(VTable)来查找到实际方法的地址。

语法

//在基类声明中定义虚函数: class Base { public: virtual void DoSomething(); };

//在子类声明中覆盖虚函数: class Derived : public Base { public: void DoSomething() override; };

在基类中定义一个虚函数时,必须在函数声明中使用 virtual 关键字。如果您想其在子类中被继承,则需要在访问说明符后使用该关键字。在子类中覆盖虚函数时,需要使用 override 关键字,以帮助编译器查找组合关系中的错误。

使用

虚函数在继承关系中非常有用。例如,如果您有一个 Base 类,其中包含一个名为 DoSomething 的虚函数,您希望在 Derived 类中更改 DoSomething 方法的实现,则可以将其覆盖为 Derived 的特定实现。当您调用实际的 DoSomething 方法时,虚函数表将用于查找 Derived 方法的地址,而不是 Base 方法。

示例1:调用虚函数

下面是一个简单的示例,展示如何从基类和派生类中调用虚函数。请注意,在这里代码中,pBase 指向 Derived 类的实例,但是调用的是 Derived 的虚函数,而不是 Base 的实际函数。

#include

class Base { public: virtual void DoSomething() { std::cout << "Base DoSomething() called" << std::endl; } };

class Derived : public Base { public: void DoSomething() override { std::cout << "Derived DoSomething() called" << std::endl; } };

int main() { Derived derived; Base* pBase = &derived;

pBase->DoSomething(); // 调用 Derived::DoSomething() }

输出:

Derived DoSomething() called

示例2:使用虚函数进行动态绑定

下面是一个更高级的示例,演示如何使用虚函数进行动态绑定。假设有一个 Shape 的基类,包含一个名为 Draw 的虚方法,并且有两个派生类: Circle 和 Square。如下图所示:

我们可以定义一个名为 draw_all 的方法,该方法将为每个形状调用 Draw 方法。在这种情况下,我们将使用循环遍历形状的列表,并根据基类指针调用 Draw 方法。但是,由于 Draw 是虚的,所以它将总是委托给子类调用。

#include #include

class Shape { public: virtual void Draw() { std::cout << "Base shape drawing" << std::endl; } };

class Circle : public Shape { public: void Draw() override { std::cout << "Circle drawing" << std::endl; } };

class Square : public Shape { public: void Draw() override { std::cout << "Square drawing" << std::endl; } };

void draw_all(const std::vector<Shape*>& shapes) { for (const auto& shape : shapes) { shape->Draw(); } }

int main() { std::vector<Shape*> shapes = {new Circle(), new Square(), new Circle(), new Square()}; draw_all(shapes); }

输出:

Circle drawing Square drawing Circle drawing Square drawing

总结

这篇文章介绍了C++虚函数的基本概念、语法、使用及其示例。虚函数是面向对象编程中非常重要的概念,常用于继承关系中,允许子类重写基类方法,以实现更多的灵活性和可复用性。通过使用虚函数表,C++可以确保在必要的时候调用正确的方法,从而提高程序的整体性能。

到此这篇关于一文详解C++虚函数的文章就介绍到这了,更多相关C++ 虚函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Qt自定义Widget实现互斥效果详解

    Qt自定义Widget实现互斥效果详解

    在使用Qt时,可能会遇到这种问题:多个控件互斥,类似于QRadiButton控件,但又不是单纯的QRadioButton控件,互斥的可能是一个窗口,也可能是几个按钮,等等多种情况。本文将介绍利用Qt自定义Widget实现的互斥效果,需要的可以参考一下
    2022-01-01
  • C/C++语言八大排序算法之桶排序全过程示例详解

    C/C++语言八大排序算法之桶排序全过程示例详解

    这篇文章主要为大家介绍了C/C++语言八大排序算法之桶排序算法过程的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • 探索Visual C++下创建WPF项目的方法示例

    探索Visual C++下创建WPF项目的方法示例

    这篇文章主要介绍了探索Visual C++下创建WPF项目的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • C语言数组和指针,内存之间的关系

    C语言数组和指针,内存之间的关系

    这篇文章主要介绍了C语言数组和指针,内存之间的关系,首先论证一维数组和一级指针之前的关系,我们常常使用一级指针指针的方式访问一维数组,只有对内存的理解到位才能理解它们直接的关系。需要的小伙伴可以参考一下
    2022-02-02
  • 一文带你简单了解c++正则表达式

    一文带你简单了解c++正则表达式

    正则表达式在匹配字符串,验证输入合法性时经常用到.C++ 11标准库中已经支持了正则表达式,下面这篇文章主要给大家介绍了关于c++正则表达式的相关资料,需要的朋友可以参考下
    2023-04-04
  • C++ 折叠参数包详解(悄然增强编程效率)

    C++ 折叠参数包详解(悄然增强编程效率)

    折叠参数就是一个参数包, 代表是多个未知,tuple元组就是一个折叠参数的使用,这篇文章主要介绍了C++ 折叠参数包悄然增强编程效率,需要的朋友可以参考下
    2023-05-05
  • QT实现多线程两种方式案例详解

    QT实现多线程两种方式案例详解

    这篇文章主要介绍了QT实现多线程两种方式案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • cin.get()和cin.getline()之间的区别

    cin.get()和cin.getline()之间的区别

    以下是对cin.get()和cin.getline()的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-09-09
  • C++ Cmake的构建静态库和动态库详解

    C++ Cmake的构建静态库和动态库详解

    这篇文章主要为大家详细介绍了C++ Cmake的构建静态库和动态库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 关于C++继承你可能会忽视的点

    关于C++继承你可能会忽视的点

    继承是面向对象三大特性之一,有些类与类之间存在特殊的关系,下面这篇文章主要给大家介绍了关于C++继承你可能会忽视的点,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02

最新评论