首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

虚函数和性能 - C++

虚函数是C++中的一种特性,它允许在派生类中重写基类中的成员函数。虚函数的主要目的是实现多态性,即允许一个基类指针或引用能够调用派生类的成员函数。虚函数的性能开销主要来自于虚函数表,这是一个存储虚函数指针的表格,每个对象都有一个指向虚函数表的指针。当调用虚函数时,程序会通过对象的虚函数表指针找到相应的函数指针,并调用该函数。

虚函数的性能可能会受到虚函数表大小、编译器优化等因素的影响。然而,在大多数情况下,虚函数的性能开销相对较小,对于大多数应用程序来说,这种开销是可以接受的。在一些对性能要求非常高的场景中,可以考虑使用其他技术来替代虚函数,例如模板和编译时多态性。

总之,虚函数是C++中实现多态性的一种重要手段,它的性能开销通常可以接受,但在对性能要求非常高的场景中,需要注意性能问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++函数指针函数列表

本篇文章主要来讲述,C++多态的实现原理,也就是函数函数列表是怎么回事?它们是如何实现多态的?...函数概述: 首先,C++多态的实现是通过关键字virtual,有了这个关键字之后,通过继承的关系就可以在程序运行时,使用子类的函数替换掉父类的函数,达到多态的作用。...C++实现函数的方法:为每个类对象添加一个隐藏成员,隐藏成员保存了一个指针,这个指针叫表指针(vptr),它指向一个函数表(virtual function table, vtbl)(备注:一个类对象一个指针...基类的函数列表继承类的函数列表是两个,是不相同的,继承类的函数列表中存储的是继承类的函数实现,如果继承类没有实现基类的函数的话,会存储基类的函数地址。例子参见继承类的执行结果。...C++多态的副作用 C++采用函数函数列表的方式来实现多态,确实给我们带来了很大的好处,让我们可以在不改变代码的时候,就能直接替换成运行的继承类的函数

1.4K31

C++函数

是不是咱们预期的不一样!所以才有了函数,下面对上面的程序进行改造。...函数的使用方法(以下内容 摘自《C++面向对象程序》): (1)在基类用virtual声明成员函数函数。    ...(2)在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数类型全部与基类的函数相同,并根据派生类的需要重新定义函数体。    ...C++规定,当一个成员函数被声明为函数后,其派生类中的同名函数都自动成为函数。    ...什么时候应该把一个成员函数声明为函数呢? (1)首先看成员函数所在的类是否会作为基类。然后看成员函数在类的继承后有无可能被更改功能,如果希望更改其功能的,一般应该讲其声明为函数

1.1K30
  • C++函数与纯函数

    C++函数是一种特殊的成员函数,用于实现多态性。函数允许在基类中声明一个函数,在派生类中根据需要进行重写,并通过基类指针或引用来调用派生类对象的特定实现。...①函数的声明 在基类中,我们可以使用关键字virtual来声明一个函数。...重写的函数必须具有相同的名称、返回类型参数列表。...." << endl; } }; ④纯函数 函数也可以被声明为纯函数,即没有默认实现的函数。纯函数通过在声明中使用= 0来标识。...函数使用动态绑定,即运行时将根据对象的实际类型选择正确的函数实现。 构造函数不能是函数。 静态成员函数不能是函数函数可以被继承,派生类可以选择是否重写函数

    20410

    C++学习——函数与纯函数

    文章目录 引言: 一、函数的定义使用 关于函数,说明以下几点: 函数的访问 二、纯函数 三、补充内容 指向类中数据成员的指针变量 例题: 引言: 若要访问派生类中相同名字的函数,必须将基类中的同名函数定义为...一、函数的定义使用 可以在程序运行时通过调用相同的函数名而实现不同功能的 函数称为函数。...指向类成员的指针 在C++中可以定义一种特殊的指针,它指向类中的成员函数或类中的数据成员。并 可通过这样的指针来使用类中的数据成员或调用类中的成员函数。...6、当用这种指针指向静态的成员函数时,可直接使用类名而不要列举对象名。这 是由静态成员函数的特性所确定的。 例题: 通过函数实现一个计算矩形面积三角形状面积的程序。...基类为形状类,派生类为矩形类三角形类,通过基类指针指向不同的派生类对象,调用求面积函数,得到相应的面积结果,实现多态性。

    2.4K20

    C++ 多态、函数、纯函数《Rice C++ 学习开发》

    这一篇文章来讲讲C++的多态、函数、纯函数C++多态 多态:C++中的多态分为静态多态,动态多态。...对于通过基类指针调用基类派生类中都有的同名、同参数表的函数的语句,编译时并不确定要执行的是基类还是派生类的函数;而当程序运行到该语句时,如果基类指针指向的是一个基类对象,则基类的函数被调用,如果基类指针指向的是一个派生类对象...纯函数就是函数函数主体=0,也就是没有主体。...{ width = a; height = b; } virtual int area() = 0; } 注意: ①函数函数在多态中,存在差异,函数在派生类中可以选择是否重写该函数...而纯函数必须在派生类中实现该纯函数。 ②当类中存在纯函数,则该类为抽象类。

    32420

    C++函数详解

    C++函数详解 前言 C++的特性使得我们可以使用函数继承的方法快速实现开发,而为了满足多态与泛型编程这一性质,C++允许用户使用函数 (virtual function) 来完成 运行时决议 这一操作...函数表实现原理 函数的实现是由两个部分组成的,函数指针与函数表。...只有拥有函数的类才会拥有函数指针,每一个函数也都会对应一个函数指针。所以拥有函数的类的所有对象都会因为函数产生额外的开销,并且也会在一定程度上降低程序速度。...与JAVA不同,C++将是否使用函数这一权利交给了开发者,所以开发者应该谨慎的使用。...C++中一个类是公用一张函数表的,基类有基类的函数表,子类是子类的函数表,这极大的节省了内存 同名覆盖原则与const修饰符 如果继续深入下去的话我们将会碰见一个有趣的状况 class Base

    52010

    c++函数

    概述 首先,相较于C语言,C++语言并没有额外增加内存消耗(确切说,在没有函数情况下)。...对于一个C++类对象,每个对象有独立的数据成员(非static),但是内存中成员函数只有一份,该类的所有对象共享成员函数。 编译器在编译阶段,进行函数的重构,即将成员函数进行非成员化。...通过将this指针作为函数的第一个参数,通过this指针即可以找到对象的数据成员 使用GDB调试 C++ 函数 class Base { public: int a;...构造函数函数函数表创建时机是在编译期间。 编译期间编译器就为每个类确定好了对应的函数表里的内容。...所以在程序运行时,编译器会把函数表的首地址赋值给函数表指针,所以,这个函数表指针就有值了。 ?

    66520

    C++:14---继承,函数,多态

    最后构造D 如果基类构造函数为带参构造,则其子类,以及子类拓展出来的子类,都要在成员初始化列表对其进行构造函数的初始化 d的data赋值为1,继承于B、C,分别赋值为2,3,顺序为从左至右。...地址解析: BC中都保存了A的值,但是在D继承BC的时候,只保存了一份A,且放在最后 在D继承的BC内存段中分别有一个函数指针放在最前方 二、函数表 1.概念:是一块连续的内存,所有函数的首地址都存放在函数表中...,其大小为4字节 2.注意 只有类中有函数时,才有函数表 父子类之间的函数表是不同的地址,且函数表中的函数的首地址也不同 class A { public: virtual void run1...run1(){}; virtual void run2(){}; }; int main() { cout<<sizeof(A); //4 cout<<sizeof(B); //4 } 3.通过指针访问函数表中的函数...原理:通过指针遍历函数表然后打印函数函数都是按照顺序在内存中存储的 class A { public: virtual void run1(){cout<<"A1";}; virtual void

    71710

    C++:13---多态函数

    每一个有函数的类(或有函数的类的派生类)都有一个函数表,该类的任何对象中都放着该函数表的指针(可以认为这是由编译器自动添加到构造函数中的指令完成的)。...函数表是编译器生成的,程序运行时被载入内存。一个类的函数表中列出了该类的全部函数地址。例如,在上面的程序中,类 A 对象的存储空间以及函数表(假定类 A 还有其他函数)如图 1 所示。...图2:类B对象的存储空间以及函数表 多态的函数调用语句被编译成根据基类指针所指向的(或基类引用所引用的)对象中存放的函数表的地址,在函数表中查找函数地址,并调用函数的一系列指令。...2) 根据函数表的地址找到函数表,在其中查找要调用的函数的地址。不妨认为函数表是以函数名作为索引来查找的,虽然还有更高效的查找方法。...3) 根据找到的函数的地址调用函数

    70720

    C++函数表详解

    参考链接: C++函数 C++函数(Virtual Function)是通过一张函数表(Virtual Table)来实现的。简称为V-Table。...函数表中只存有一个函数的指针地址,不存放普通函数或是构造函数的指针地址。...只要有函数C++类都会存在这样的一张函数表,不管是普通函数  亦或 是 纯函数,亦或是 派生类中隐式声明的这些函数都会 生成这张函数表。 ...函数表创建的时间:在一个类构造的时候,创建这张函数表,而这个函数表是供整个类所共有的。函数表存储在对象最开始的位置。  首先了解下函数表:函数表其实就是函数指针的地址。...但在运行时,我们可以通过指针的方式访问函数表来达到违反C++语义的行为。

    30330

    C++多态与函数

    概念 1.1 多态 不同类的对象对相同的方法或函数产生有不同的反应。多态的实现依赖于函数 静态多态动态多态 静态多态(编译时多态) 这是通过方法重载实现的一种多态性形式。...2.3 构造函数可以为函数吗 在C++中,构造函数(包括拷贝构造函数移动构造函数)不能声明为函数。...表指针存放在哪里? 表的工作原理: 每个包含函数C++类都有一个对应的函数表。 表中存储了该类中的函数地址。 每个对象都包含一个指向其类的表指针。...2.4 函数重载重写区别 范围区别:重写被重写的函数在不同的类中,重载被重载的函数在同一类中。...virtual的区别:重写的基类函数必须要有virtual修饰,重载函数被重载函数可以被virtual修饰,也可以没有 2.5 C++多态示例 #include using namespace

    15210

    C++函数表详解

    参考链接: C++函数覆盖 C++函数(Virtual Function)是通过一张函数表(Virtual Table)来实现的。简称为V-Table。...函数表中只存有一个函数的指针地址,不存放普通函数或是构造函数的指针地址。...只要有函数C++类都会存在这样的一张函数表,不管是普通函数  亦或 是 纯函数,亦或是 派生类中隐式声明的这些函数都会 生成这张函数表。 ...函数表创建的时间:在一个类构造的时候,创建这张函数表,而这个函数表是供整个类所共有的。函数表存储在对象最开始的位置。  首先了解下函数表:函数表其实就是函数指针的地址。...但在运行时,我们可以通过指针的方式访问函数表来达到违反C++语义的行为。

    63120

    C++ 函数表剖析

    一、概述 为了实现C++的多态,C++使用了一种动态绑定的技术。这个技术的核心是函数表(下文简称表)。本文介绍函数表是如何实现动态绑定的。 二、类的表 每个包含了函数的类都包含一个表。...四、动态绑定 说到这里,大家一定会好奇C++是如何利用表指针来实现动态绑定的。我们先看下面的代码。...类A,类B,类C的对象都拥有一个表指针,*__vptr,用来指向自己所属类的表。 类A包括两个函数,故A vtbl包含两个指针,分别指向A::vfunc1()A::vfunc2()。...类B继承于类A,故类B可以调用类A的函数,但由于类B重写了B::vfunc1()函数,故B vtbl的两个指针分别指向B::vfunc1()A::vfunc2()。...C++通过函数表,实现了函数与对象的动态绑定,从而构建了C++面向对象程序设计的基石。

    77610

    C++之纯函数

    C++没有接口类,它通过使用纯函数来生成抽象类。抽象类可以作为接口的集合,实现了接口类的功能。...C++中含有纯函数的类叫做抽象类,顾名思义,它本身就是行为抽象的集合,因此它只描述了有这个行为,但是并未描述行为的具体做法,具体的做法在派生类中去实现,不同的派生类有不同的实现。...纯函数函数的特殊表现,它的一般形式: class 类名 { virtual 函数返回值类型 函数名 (参数列表) = 0; //即,抽象类不去实现函数体 }; 实际上C++允许抽象类实现函数体...抽象类不能被实例化,因为大多数时候的抽象类的纯函数都没有相应的实现。 由于基类的指针(引用)可以使用子类的函数,这样,我们通过抽象类的指针可以去调用派生类对象的函数。...下面是一段代码来展示抽象类函数

    77220

    C++多态与函数

    Contents 1 C++ 多态概念 2 C++ 多态实例 3 C++ 多态总结 4 函数 5 多态应用 6 参考资料 本文文学习笔记总结讲得比较浅显,更深入内容可以参考C++ Primer。...C++ 多态总结 有了函数,基类指针指向基类对象时就使用基类的成员(包括成员函数成员变量),指向派生类对象时就使用派生类的成员。...注意:多态的特性的 virtual 修饰,不单单对基类派生类的普通成员函数有必要,而且对于基类派生类的析构函数同样重要。 函数 函数字面意思是在基类中使用关键字 virtual 声明的函数。...函数函数都是为了多态性服务,使得基类指针或引用可以指向变化多端的子类以实现变化多端的版本。在派生类中重新定义基类中定义的函数时,会告诉编译器不要静态链接到该函数。...参考资料 C++多态函数快速入门教程

    29020

    C++:多态#1函数

    多态 函数 函数的声明很简单,在成员函数声明处用 virtual 关键字标志即可,例如以下片段 class base{ public: virtual void fun(){...<<endl; } }; 这样的函数是不恰当的,基类中的 void fn(int x)子类中的 void fn(float x)显然是两个不同的函数,它们仅仅是同名函数重载,虽然 subClass...函数返回类型的例外 之前我提到如果基类与子类的函数仅仅是函数名相同,参数类型不同或返回类型不同,即使加上了关键字 virtual,编译器也不会对其进行滞后联编。...<<endl; return this; } }; 函数的几大限制 只有成员函数才能是函数,因为函数仅适用于有继承关系的类对象。...静态成员函数不能为函数,因为静态成员不受限于单个对象。 内联函数不能为函数。 构造函数不能为函数。 析构函数可以是函数,从而适应基类与子类对象的异同。

    29110

    C++不要在构造函数析构函数中调用函数

    虽然可以对函数进行实调用,但程序员编写函数的本意应该是实现动态联编。在构造函数中调用函数函数的入口地址是在编译时静态确定的,并未实现调用。...但是为什么在构造函数中调用函数,实际上没有发生动态联编呢? 1. 不要在构造函数中调用函数的原因 第一个原因,在概念上,构造函数的工作是为对象进行初始化。...在Visual C++中,包含函数的类对象的指针被安排在对象的起始地址处,并且函数表(vtable)的地址是由构造函数写入指针的。...因此,一般情况下,应该避免在构造函数析构函数中调用函数,如果一定要这样做,程序猿必须清楚,这是对函数的调用其实是实调用。...---- 参考文献 [1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[8.6(P299-P302)]

    3.2K30

    从零开始学C++函数与多态(一):函数表指针、析构函数、object slicing与函数C++对象模型图

    由于vptr在对象中的偏移不会随着派生层次的增加而改变,而且改写的函数在派生类vtable中的位置与它在基类vtable中的位置始终保持一致,有了这两条保证,再加上被改写函数与其基类中对应函数的原型调用规范都保持一致...函数的覆盖与隐藏可以参考这里。 三、几道c++面试题 1....所以结果是分别调用的是Base::doPrintDerived::doPrint2。 四、析构函数 何时需要析构函数?...六、C++对象模型图 Rectangle 继承自Shape类,Shape的析构函数函数,draw为纯函数 ? ?...参考: C++ primer 第四版 Effective C++ 3rd C++编程规范 《高质量程序设计指南》 http://zhedahht.blog.163.com/

    1.1K00
    领券