首页 > 编程语言 >C++虚函数 覆盖(重写)

C++虚函数 覆盖(重写)

时间:2023-08-29 18:45:49浏览次数:37  
标签:虚表 函数 子类 同名 C++ 父类 重写 指针

1、虚函数     在成员函数前面加 virtual 后,该函数就称为虚函数,此时该类就会像虚继承一样多了一个虚表指针(虚函数表指针、虚指针) 2、虚函数表     虚表指针指向的是属于该类的一张表格的首地址,该表格中记录了该类中所有虚函数的首地址         如果类中没有其他成员变量         通过((void(*)(void))(**(int**)b))(); 可以直接通过虚函数表以及虚表指针来访问虚函数中第一个虚函数 void func(void) 3、覆盖(重写) 是构成多态的基础         当使用 virtual 修饰父类的成员函数时,此时父类中就会多一个虚表指针以及一张虚函数表,子类继承父类时会把父类的虚表指针以及虚函数表一起继承过来,然后编译器会去比较父子类中同名的虚成员函数的格式,如果格式完全相同的虚函数,就会把子类中虚函数表中原来同名父类虚函数的地址改为子类同名函数的地址,这时就称为覆盖         此时使用父类指针或引用指向子类对象时,调用虚函数则会去执行的是被覆盖后的虚函数表中所指向子类的同名且格式相同的成员函数,不再调用父类的同名虚函数 4、构成覆盖的条件         1、子类以public继承父类         2、父类中被覆盖的函数必须是虚函数         3、子类中必须有与父类虚函数同名的成员函数,且该函数的返回值、参数列表、常属性都必须相同         4、返回值类型相同,或者子类同名成员函数的返回值类型可以向父类虚函数的返回值类型做隐式转换,且有继承关系

标签:虚表,函数,子类,同名,C++,父类,重写,指针
From: https://www.cnblogs.com/ycddqr/p/17665613.html

相关文章

  • Vue3 响应式工具函数
    isRef()​检查某个值是否为ref。unref()​如果参数是ref,则返回内部值,否则返回参数本身。这是 val=isRef(val)?val.value:val 计算的一个语法糖toRef()​可以将值、refs或getters规范化为refs(3.3+)。也可以基于响应式对象上的一个属性,创建一个对应的ref。这......
  • golang 协程、延迟函数调用、以及恐慌和恢复
    此篇文章将介绍协程和延迟函数调用。协程和延迟函数调用是Go中比较独特的两个特性。恐慌和恢复也将在此篇文章中得到简单介绍。本文并非全面地对这些特性进行介绍,后面的其它文章会陆续补全本文的未介绍的内容。协程(goroutine)现代CPU一般含有多个核,并且一个核可能支持多线程。......
  • MySQL数据库:第十六章:sql高级函数
    我最常用的一个函数是FIND_IN_SET逗号分隔的list列表SELECTID,FID,APP_CODE,PARAM_VALUE,PARAM_TEXT,PARAM_SCHEAME,SHOWORDERFROMG_APP_DATA_CONSUME_PARAMWHEREFIND_IN_SET(FID,‘1,2,3,’)ORDERBYSHOWORDERDESC一、数学函数ABS(x)返回x的绝对值BIN(x)返回x的二......
  • Prometheus监控实战系列八:标签重写
    标签重写(Relabeling)是Prometheus一个非常有用的功能,它可以在任务拉取(scraping)阶段前,修改target和它的labels。该功能在日常的监控中常常会使用到,值得我们好好了解。 一. 默认标签 默认情况下,Prometheus加载targets后,都会包含一些默认的标签,其中以__作为前置的标签是在系......
  • 值得收藏的前端开发必备工具类函数
     /***空值:[undefined,null,NaN,[],{}],注意非空:0,false;*@param{*}value*@returnsBoolean*/functionisEmpty(value){switch(Object.prototype.toString.call(value)){case'[objectUndefined]':returnvalue===vo......
  • 【Effective C++】定制new和delete
    文章目录一、了解new-handler的行为1、new和malloc的对比2、set_new_handler的使用3、new-handler设计要求4、提供自己的set_new_handler和operatornew5、请记住二、了解new和delete的合理替换时机1、替换编译器提供的operatornew或operatordelete2、请记住三、编写new和delete......
  • Swift - 高阶函数介绍(map、flatMap、filter、reduce)
     Swift-高阶函数介绍(map、flatMap、filter、reduce)https://blog.csdn.net/Alexander_Wei/article/details/78543410?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-78543410-blog-127072873.235%5Ev38%5Epc_r......
  • C++算法
    运行前进行卡夫曼滤波(减小机器检测波动的影响)延迟上机算法速率法原理1、判断最新数据点和前面几个点的差值是否大于设定值2、判断两点间的斜率k是否大于设定值3、判断拟合曲线的符合度是否在规定范围内技术实现///\brief直线拟合-一元回归,拟......
  • c++ 删除 类的拷贝和赋值函数
      #pragmaonce#include"include/cef_app.h"classHttpSchemeFactory:publicCefSchemeHandlerFactory{public:HttpSchemeFactory()=default;//删除拷贝函数HttpSchemeFactory(constHttpSchemeFactory&)=delete;//删除赋值函数H......
  • C++运算符重载
    C语言是没运算符重载的,C++进行了扩充。C++比C语言多了面向对象(类),多了函数重写,运算符重载,实现了(函数重载跟运算符重载都属于编译器静态绑定了地址,所以是静态多态,而虚函数需要在运行期确定,是动态多态)。 如何实现C++跟C语言混合编程?extern"C",其修饰的代码段需要以C语言的方式进......