当前位置:首页 > 科技  > 软件

探秘C++虚函数:解密多态的奥秘

来源: 责编: 时间:2024-04-22 09:15:22 300观看
导读虚函数—作为面向对象编程的核心特性之一,虚函数不仅在代码中发挥着重要作用,更是实现多态性的关键所在。什么是虚函数?在 C++ 中,虚函数是为了实现运行时多态性而设计的特殊类型的函数。通过在基类中声明虚函数,并在派生

虚函数—作为面向对象编程的核心特性之一,虚函数不仅在代码中发挥着重要作用,更是实现多态性的关键所在。5Hp28资讯网——每日最新资讯28at.com

5Hp28资讯网——每日最新资讯28at.com

什么是虚函数?

在 C++ 中,虚函数是为了实现运行时多态性而设计的特殊类型的函数。通过在基类中声明虚函数,并在派生类中进行重写,可以在程序运行时根据实际对象类型确定调用的函数版本。这为我们提供了一种灵活的方式来处理继承关系,使得代码更具可扩展性和可维护性。5Hp28资讯网——每日最新资讯28at.com

虚函数表的作用

虚函数表(virtual function table,简称 Vtable)是 实现虚函数的重要机制之一。每个类(包括含有虚函数的类)都会生成一个对应的虚函数表,其中存储了该类中所有虚函数的地址。5Hp28资讯网——每日最新资讯28at.com

当对象被创建时,会分配一个指向其类的虚函数表的指针(虚指针)。通过这个指针,程序能够在运行时确定调用的函数版本,实现了动态绑定。注意与静态绑定混淆重载-静态绑定(链接)。5Hp28资讯网——每日最新资讯28at.com

虚函数表的性质

  • 每个类都有自己的虚函数表:当一个类中包含至少一个虚函数时,编译器会为该类生成一个虚函数表。 
  • 虚函数表中存储的是函数指针:虚函数表中的每个条目都是一个指向对应虚函数的函数指针。 
  • 对象含有指向其类的虚函数表的指针:每个对象都含有一个指向其类的虚函数表的指针,通过这个指针实现动态绑定。 

派生类的虚函数表包含基类的虚函数表内容,并扩展新函数:派生类的虚函数表通常是在基类的虚函数表的基础上进行扩展的。 5Hp28资讯网——每日最新资讯28at.com

示例代码解释 让我们通过一段简单的代码来说明虚函数表的工作原理:5Hp28资讯网——每日最新资讯28at.com

#include <iostream>class Base {public:    virtual void func1() {        std::cout << "Base::func1()" << std::endl;    }    virtual void func2() {        std::cout << "Base::func2()" << std::endl;    }};class Derived : public Base {public:    void func1() override {        std::cout << "Derived::func1()" << std::endl;    }    void func3() {        std::cout << "Derived::func3()" << std::endl;    }};int main() {    Base* ptr = new Derived();    ptr->func1(); // 动态绑定    ptr->func2(); // 动态绑定    delete ptr;    return 0;}

5Hp28资讯网——每日最新资讯28at.com

在这个示例中,我们创建了一个基类 Base 和一个派生类 Derived,后者重写了基类中的 func1()。5Hp28资讯网——每日最新资讯28at.com

在 main() 函数中,我们创建了一个基类指针指向派生类对象,并通过该指针调用了两个虚函数 func1() 和 func2()。由于 func1() 是虚函数,并且对象是 Derived 类型,所以会动态绑定到 Derived::func1()。而 func2() 在派生类中没有被重写,所以会绑定到基类的版本。5Hp28资讯网——每日最新资讯28at.com

虚函数表的大小

先看一个例子(操作环境64位系统)5Hp28资讯网——每日最新资讯28at.com

//先看空类大小class test {};//只有一个虚函数的类大小class test1 {  public:    virtual void function(){    std::cout << "function()" << std::endl;    }};//两个虚函数类的大小class test2 {  public:    virtual void function1(){    std::cout << "function1()" << std::endl;    }        virtual void function2(){    std::cout << "function2()" << std::endl;    }};int main(){  std::cout<<"sizeof test: "<<sizeof(test)<<std::endl;  std::cout<<"sizeof test1: "<<sizeof(test1)<<std::endl;  std::cout<<"sizeof test2: "<<sizeof(test2)<<std::endl;  return 0;}

5Hp28资讯网——每日最新资讯28at.com

类在内存中记录虚函数是以一个指针记录的,并且该指针指向一个数组,数组中装着的是虚函数的地址。同时,经过实验,64bit的编译器下,虚函数表的指针大小是8字节。5Hp28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-84466-0.html探秘C++虚函数:解密多态的奥秘

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 探讨视觉追踪技术在VR安全中的风险

下一篇: 频繁切换v-show,不频繁使用v-if?面试的时候可别再这么说了!

标签:
  • 热门焦点
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元&ldquo;人在职场,应该选择什么样的着装?&rdquo;近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • 三星折叠屏手机去年销售近1000万台 今年目标定为1500万

    7月29日消息,三星率先发力可折叠手机市场,在全球市场已经取得了非常亮眼的成绩,接下来会进一步巩固和扩大这一优势。三星在推出Galaxy Z Flip5和Galax
  • 到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
  • 三翼鸟智能家居亮相电博会,让用户体验更真实

    2021电博会在青岛国际会展中心开幕中,三翼鸟直接把“家”搬到了现场,成为了展会的一大看点。这也是三翼鸟继9月9日发布了行业首个一站式定制智慧家平台后的
Top