一文带你学习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中各种消息框对话框的使用

    深入理解Qt中各种消息框对话框的使用

    本篇文章主要介绍了Qt中各种消息框的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • C++类的返回值是*this的成员函数问题

    C++类的返回值是*this的成员函数问题

    这篇文章主要介绍了C++类的返回值是*this的成员函数问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • vscode使用官方C/C++插件无法进行代码格式化问题

    vscode使用官方C/C++插件无法进行代码格式化问题

    这篇文章主要介绍了vscode使用官方C/C++插件无法进行代码格式化问题,本文通过截图实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • 详解如何使用openssl创建自签名证书

    详解如何使用openssl创建自签名证书

    这篇文章主要为大家介绍了详解如何使用openssl创建自签名证书示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • C语言实现学生宿舍信息管理系统课程设计

    C语言实现学生宿舍信息管理系统课程设计

    这篇文章主要为大家详细介绍了C语言实现学生宿舍信息管理系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C语言行优先和列优先的问题深入分析

    C语言行优先和列优先的问题深入分析

    这篇文章主要介绍了C语言行优先和列优先的问题深入分析的相关资料,需要的朋友可以参考下
    2017-01-01
  • C语言自定义数据类型的结构体、枚举和联合详解

    C语言自定义数据类型的结构体、枚举和联合详解

    这篇文章主要给大家介绍了关于C语言自定义数据类型的结构体、枚举和联合的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • C语言 数组指针详解及示例代码

    C语言 数组指针详解及示例代码

    本文主要介绍C语言 数组指针,这里整理了相关资料并附示例待会及实现结果,帮助大家学习C语言中指针的知识,有需要学习此部分内容的朋友可以参考下
    2016-08-08
  • C语言详解实现猜数字游戏步骤

    C语言详解实现猜数字游戏步骤

    猜数字是兴起于英国的益智类小游戏,起源于20世纪中期,一般由两个人或多人玩,也可以由一个人和电脑玩。游戏规则为一方出数字,一方猜,今天我们来实现这个游戏案例
    2022-07-07
  • 基于C语言sprintf函数的深入理解

    基于C语言sprintf函数的深入理解

    本篇文章是对C语言中的sprintf函数进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论