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

【C++】多态

那要想实现多态,必须满足两个条件 2.2.1 条件1:虚函数重写一个条件: 被调用函数必须是虚函数,且派生必须函数进行重写 那什么是虚函数重写呢?...虚函数重写(也可以叫覆盖): 派生中有一个完全相同函数(即派生函数函数返回类型函数名字、参数列表完全相同),称子类函数重写函数。...3.2 协变 虚函数重写第二个例外: 派生重写函数时,与函数返回类型可以不同。...但是是有要求函数必须返回对象指针或引用,派生函数必须返回派生对象指针或引用,我们把这种情况称为协变。...我们知道虚函数重写的话必须加virtual,子类可以不加,但建议加上 所以如果把父virtual去掉就会报错 因为子类里加了override,它必须函数进行重写

9110

三大特性之多态

多态构成必须要满足两个条件: 1.必须要通过父引用或者指针作为形参来调用 为什么一定要是父引用或者指针,对于这个问题《深度探索C++模型》这样说:“一个pointer或一个reference...返回类型函数名称,参数列表相同),那么就称该子类函数重写了父函数。...重写两个例外 1.协变 子类对于父函数重写返回类型可以不同,但必须要是返回父子类关系指针或引用(即函数返回对象指针或者引用,派生函数返回派生对象指针或者引用),称为协变 class...如果定义了一个子类对象,并将该子类对象赋值给一个指针,当我释放父时候只会调用父析构函数,也就是说只释放了子类那一部分资源,而没有释放子类资源,这就可能会导致内存泄漏。...如果将析构函数定义为虚函数重写,那么在释放父指针时候,调用是子类析构函数,子类析构函数对于父那一部分资源通过父析构函数清理,同时也会清理自己资源。

16320
您找到你想要的搜索结果了吗?
是的
没有找到

【C++】多态

协变也是虚函数重写特殊情况,三同返回值可以不同,但是要求返回必须一个父子类关系指针或引用,自己或其他都可以。实际并不常见,大家只要了解一下这个语法就够了。...则派生也会继承父BuyTicket // 建议父子类都加上virtual // 2.协变:三同返回值可以不同,但是要求返回必须一个父子类关系指针或引用,自己或其他都可以...满足多态调用,首先调用函数必须重写函数如果函数只是简单继承到父,父并没有显示写出来虚函数,则这样也不能算是重写函数,不符合多态,具体细节放到多态原理部分讲解),更为重要必须指针或者引用调用重写函数...但上面这样方式只适用于32位平台下4字节指针,如果让程序同时适应32位和64位呢?...重写指的是在继承体系,派生继承函数,并且虚函数函数名参数列表返回值均与相同,重写是虚函数实现,这样函数就称之为重写

51120

多态

多态定义及实现 多态是继承时,对象去调用同一个对象产生不同行为 要构成多态条件有两个 虚函数重写 对象或引用调用虚函数函数重写 什么是虚函数?...虚函数重写条件 是虚函数,且函数名,返回类型,参数类型相同(三同) 三同,但是只有父写virtual也构成重写 特殊情况: 其他条件相同,返回类型为父子对象或指针类型也构成重写——这个也叫做协变...所以析构函数重写只需要在上加上virtual就可以构成重写。 为什么对析构函数进行重写呢?...虚表指针它是一个函数指针数组指针,什么意思呢?——它是一个指针,它指向一个数组,数组每个元素都是一个函数指针。...当我们调换派生print和f2位置时候也是打印相同结果;说明虚表先继承函数然后再放自己函数函数是按声明顺序储存在虚表

23220

C++从入门到精通(第九篇) :多态

Person对象买票全价,Student对象买票半价 那么在继承要构成多态还有两个条件: 必须通过指针或者引用调用虚函数 被调用函数必须是虚函数,且派生必须函数进行重写 运行结果...(即派生函数函数返回 型、函数名字、参数列表完全相同),称子类函数重写函数。...: 协变(与派生函数返回类型不同) 派生重写函数时,与函数返回类型不同。...(与派生析构函数名字不同) 如果析构函数为虚函数,此时派生析构函数只要定义,无论是否加virtual关键字,都与 析构函数构成重写,虽然与派生析构函数名字不同。...总结一下派生虚表生成:a.先将虚表内容拷贝一份到派生虚表 b.如果派生重写 某个虚函数,用派生自己函数覆盖虚表函数 c.派生自己新增加函数按其在 派生声明次序增加到派生虚表最后

43830

【C++】继承和多态高频面试题整理

以下关于纯虚函数说法,正确是( ) A:声明纯虚函数不能实例化对象 B:声明纯虚函数是虚 C:子类必须实现纯虚函数 D:纯虚函数必须是空函数 答案:A 关于虚函数描述正确是...( ) A:派生函数函数具有不同参数个数和类型 B:内联函数不能是虚函数(可以认为语法上可以) C:派生必须重新定义函数 D:虚函数可以是一个static型函数 答案...关于虚表说法正确是( ) A:一个只能有一张虚表 B:中有虚函数如果子类没有重写函数,此时子类与共用同一张虚表 C:虚表是在运行期间动态生成 D:一个不同对象共享该类虚表...答案:D 假设A中有虚函数,B继承自A,B重写A函数,也没有定义任何虚函数,则( ) A:A对象前4个字节存储虚表地址,B对象前4个字节不是虚表地址 B:A对象和B对象前4个字节存储都是虚地址...那这样的话,如果一个内联函数真的被处理成内联函数的话,它是没有地址,那没有地址函数能是虚函数? 肯定是不行,因为虚函数必须有地址,而且地址要放进虚函数表里面。

17410

C++多态特性

在派生实现函数可以覆盖同名函数,而且会在运行时对象类型上调用合适函数。通过将指针或引用指向派生对象,可以实现动态多态性。 (2)模板(template)。...如果实现多态,也就是不同对象调用同一个函数,实现不同结果,以下代码就是实现例子,试着观察一下区别吧. 运行结果: 你需要支付10元午餐费! 你需要支付8元午餐费!...虚函数特殊情况: 斜变 派生重写函数时,与函数返回类型不同。 函数返回对象指针或者引用. 派生函数返回派生对象指针或者引用时....综上,析构函数可以是虚函数,而且还强烈建议将析构函数写成虚函数,实现多态. 虚函数重写需要遵守以下条件: 函数名称、参数列表和返回类型在父和子类必须完全相同。...(1) override: 检查派生函数是否重写某个虚函数如果没有重写编译报错。

12070

C++进阶-多态

virtual void BuyTicket() { cout << "买票-全价" << endl; } }; 虚函数重写: 派生中有一个完全相同函数(即派生函数函数返回类型...协变 函数返回对象指针或者引用,派生函数返回派生对象指针或者引用时,称为协变(与派生函数返回类型不同) 示例: class A {}; class B : public...一般情况这个数组最后面放了一个nullptr(用来表示结束)(可能根据编译器而定) 派生虚表生成总结: 先将虚表内容拷贝一份到派生虚表 如果派生重写某个虚函数,...这里覆盖地址进行了一次包装,每个地址都指向一个jump,而两个jump存是同一个函数地址 对于菱形继承/菱形虚拟继承: 实际不建议设计出菱形继承及菱形虚拟继承:一方面太复杂容易出问题,另一方面这样模型...对于虚函数会在对象成员变量中生成虚函数表指针,指向函数表中储 了该对象函数地址 对于派生会继承函数表,如果派生重写了虚函数,则会对继承函数对应函数地址进行覆盖成派生对象函数

56330

继承、接口与多态相关问题

什么是重写? 重载: a方法重载是让以统一方式处理不同类型数据一种手段。多个同名函数同时存在,具有不同参数个数/类型。重载Overloading是一个多态性一种表现。...c重载时候,方法名要一样,但是参数类型和个数不一样,返回类型可以相同也可以不相同。无法以返回型别作为重载函数区分标准。 重写: a父与子类之间多态性,对父函数进行重新定义。...如果在子类定义某方法与其父有相同名称和参数,我们说该方法被重写 (Overriding)。在Java,子类可继承父方法,而不需要重新编写相同方法。...但有时子类并不想原封不动地继承父方法,而是作一定修改,这就需要采用方法重写。方法重写又称方法覆盖。...c很好封装 d每个专注于一个任务 e通过获得和被包含对象类型相同对象引用,可以在运行时动态定义组合方式 缺点:a结果系统可能会包含更多对象 b为了使组合时可以使用不同对象,必须小心定义接口

1.4K20

C#虚方法(virtual)详解

七.虚方法作用: 一.虚方法定义: 当有一个定义在函数需要在继承实现时,可以使用虚方法,虚方法是使用关键字virtual声明,虚方法可以在不同继承中有不同实现,即为定义允许在派生重写方法...; 二.虚方法声明: 一般声明形式如下: 访问修饰符 virtual 函数返回类型 函数名(参数表) { 函数体}; 举例: class Person {...运行结果: 五.虚方法注意事项: 一定要注意,只有为虚方法时可以进行重写,不能对非虚方法进行重写; 虚方法在形式上在方法名前加virtual修饰; 虚方法一般在定义,在派生实现具体操作...,在派生可以对其方法进行调用,而且可以通过重写改变其中实现功能来实现自己一些功能,而不是虚方法时,必须重新声明方法然后再进行自己想要功能进行编写然后再进行调用,但是虚方法只需要在派生对其进行调用...,如果实现其他功能可以对其进行方法等重写,进而实现自己想要功能,调用虚方法来执行派生具体操作。

56740

QT常见面试题,基础知识偏多

答:从外观设计上:QSS、继承绘制函数重绘、继承QStyle相关重绘、组合拼装等等 从功能行为上:重写事件函数、添加或者修改信号和槽等等 QSS: QSS平时使用?能举几个例子?...通过重载event()函数,我们可以在事件被特定事件处理函数处理之前(象keyPressEvent())处理它. 比如, 当我们改变tab键默认动作时,一般要重载这个函数....信号量QSemaphore 但是还有些互斥量(资源)数量并不止一个,比如一个电脑安装了2个打印机,已经申请了一个,但是不能霸占这两个,你来访问时候如果发现还有空闲仍然可以申请到。...虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态形式调用,而纯虚函数必须在子类(sub class)实现该函数才可以使用,因为纯虚函数(base class)只有声明而没有定义...如果一个中含有纯虚函数,那么任何试图对该类进行实例化语句都将导致错误产生,因为抽象(ABC)是不能被直接调用必须被子类继承重载以后,根据要求调用其子类方法。

5.2K10

c++面试选择题_C语言经典笔试题

4.子类析构时要调用父析构函数? 析构函数调用次序是先派生析构后析构,也就是说在析构调用时候,派生信息已经全部销毁了。...允许在派生函数重新定义。 纯虚函数作用:在为其派生保留一个函数名字,以便派生根据需要对它进行定义。作为接口而存在,纯虚函数不具备函数功能,一般不能直接被调用。...从继承来纯虚函数,在派生仍是虚函数。 抽象不仅包括纯虚函数,也可包括虚函数。抽象必须用作派生其他,而不能用于直接创建对象实例。但仍可使用指向抽象指针支持运行时多态性。...如果既要利用引用提高程序效率,又要保护传递给函数数据不在函数中被改变,就应使用常引用。...格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 } 好处:在内存不产生被返回副本;(注意:正是因为这点原因,所以返回一个局部变量引用是不可取

1.1K10

C++多态与虚函数

函数 2.1 作用 虚函数作用主要是实现了多态机制。定义虚函数,子类可以重写函数;在派生对积累定义函数进行重写时,需要在派生声明该方法为虚方法。...2.2 析构函数可以为虚函数 当使用多态特性,让指针指向派生对象时,如果析构函数不是虚函数,通过指针销毁派生对象时,会调用静态绑定析构函数,也就是析构函数,从而只能销毁属于元素...2.4 纯虚函数 纯虚函数必须定义,没有具体实现代码,只有函数声明。它规定派生必须提供该函数具体实现。 注意:纯虚函数无法被实例化,只能作为来派生其他。...虚表工作原理: 每个包含虚函数C++都有一个对应函数表。 虚表存储了该类函数地址。 每个对象都包含一个指向其虚表指针。...参数区别:重写函数名,参数个数,类型,顺序以及返回类型完全一样,而重载参数个数,类型,顺序至少有一个不同。

13410

【ES三周年】C++多态

{ cout << "B" << endl; }}; 总结就是:虚函数重写条件:子类和父都是虚函数,且函数名,返回值,参数都必须相同(三同),这才能构成虚函数重写。...协变(与派生函数返回类型不同) 意思是:三同返回值可以不同,但要求返回必须是父子类关系指针或引用。...多态实现两个条件: 1.必须使用父指针或者引用调用虚函数; 2.被调用函数必须是虚函数,且子类(派生必须对虚函数进行重写; 多态是在不同继承关系对象,去调用同一函数,产生了不同行为...通过之前学习内容,我们可以了解到,如果没有成员变量,只有成员函数,会留一个字节进行占位,因为成员函数在代码段,所以Base1大小是1?...注意这里不要把虚函数表和虚表搞混了: 菱形继承为了避免数据冗余,会用虚表来解决,虚表是用来存偏移量,进而通过偏移量来找到虚; 虚继承是虚函数重写,通过虚表指针找到虚表,进而调用虚表函数

383100

【C++】非常重要——多态

{ cout << "B" << endl; } }; 总结就是:虚函数重写条件:子类和父都是虚函数,且函数名,返回值,参数都必须相同(三同),这才能构成虚函数重写。...协变(与派生函数返回类型不同) 意思是:三同返回值可以不同,但要求返回必须是父子类关系指针或引用。...多态实现两个条件: 1.必须使用父指针或者引用调用虚函数; 2.被调用函数必须是虚函数,且子类(派生必须对虚函数进行重写; 多态是在不同继承关系对象,去调用同一函数,产生了不同行为...通过之前学习内容,我们可以了解到,如果没有成员变量,只有成员函数,会留一个字节进行占位,因为成员函数在代码段,所以Base1大小是1?...注意这里不要把虚函数表和虚表搞混了: 菱形继承为了避免数据冗余,会用虚表来解决,虚表是用来存偏移量,进而通过偏移量来找到虚; 虚继承是虚函数重写,通过虚表指针找到虚表,进而调用虚表函数

33030

【C++】三大特性之多态

那么在继承要 构成多态还有两个条件: 必须通过指针或者引用调用虚函数 被调用函数必须是虚函数,且派生必须函数进行重写 2.虚函数 我们在讲继承菱形继承时候曾经说到过虚拟继承...}; 3.虚函数重写(覆盖) 派生中有一个完全相同函数(即派生函数函数返回类型函数名字、参数列表完全相同) ,称子类函数重写函数。...协变(与派生函数返回类型不同) 派生重写函数时,与函数返回类型不同。即函数返回对象指 针或者引用,派生函数返回派生对象指针或者引用时,称为协变。...总结一下派生虚表生成: a.先将虚表内容拷贝一份到派生虚表 b.如果派生重写某个虚函数,用派生自己函数覆盖虚表函数 c.派生自己新增加函数按其在派生声明次序增加到派生虚表最后...而当我们用Student对象调用时候,派生内部会拷贝虚表内容过来,但是由于我们已经重写了Person虚表函数,所以调用时候,我们找到函数实现方法也已经发生了改变

70550

C++:44---关键字virtual、override、final

,其解析过程发生在编译时而非运行时 派生可以不覆盖(重写)它继承函数 重写(覆盖)概念与规则 派生重写(覆盖)函数,其中函数名,参数列表,返回类型必须一致,并且重写(覆盖)函数是...virtual函数函数在子类和父访问权限可以不同 相关规则: ①如果函数返回类型是基本数据类型返回类型必须相同 ②如果函数返回类型本身指针或引用:返回类型可以不同,但派生返回类型小于返回类型...(不困省不省略,该函数在子类也是虚函数类型) virtual只能出现在内部声明语句之前而不能用于外部函数定义 override: 父函数不可使用 放在子类虚函数参数列表后(如果函数有尾指返回类型...,那么要放在尾指返回类型后),用来说明此函数为覆盖(重写)父函数。...,但是子类没有覆盖(重写)这个虚函数,而子类却出现了一个函数名相同、但是参数不同函数,这仍是合法

3.7K31

Java 重写与重载

Java 重写 ( Override ) 1、重写是发生在继承当中,子类改变这个方法功能而进行这么认为)。...2、方法重写规则: 参数列表必须完全与被重写方法相同 返回类型必须完全与被重写方法返回类型相同 声明为 final 方法不能被重写 声明为 static 方法不能被重写,但是能够被再次声明...Java 重载 ( Overload ) 1、重载是在一个里面,方法名字相同,而参数不同,返回类型可以相同也可以不相同。 2、每个重载方法(或者构造函数)都必须有独一无二参数类型列表。...4、重载规则: 被重载方法必须改变参数列表(就是里面要传东西,必须不一样,要么是个数不同,要么是种类不同) 被重载方法可以改变返回类型 被重载方法可以改变访问修饰符 被重载方法可以声明新或者更广检查异常...方法能够在同一或者一个子类中被重载 无法一返回类型作为重载函数区分标准 Java 重载 与 重写 区别 ?

37110

C++之多态

在继承种构成多态要满足两个条件: 必须通过指针或者引用调用虚函数(该指针或者引用操作是派生那一部分内容) 被调用函数必须是虚函数,且派生必须对虚函数进行重写。...endl; } }; 3.虚函数重写(覆盖) 派生中有一个完全相同函数函数名,参数列表返回类型等完全相同),称子类函数重写了父函数。...4.虚函数重写两个例外 协和: 派生重写函数时,与函数返回类型不同。...即函数返回对象指针或者引用,派生函数返回派生对象指针或者引用时(返回类型为继承关系指针),称为协变。...我们可以将这个现象理解为一个Bug,并不是派生虚表里没有它自己函数,而是这两个虚函数被监视窗口隐藏了。那么如果我们查看派生函数都有那些该如何进行查看呢?

33440

《逆袭进大厂》之C++篇49问49答(绝对干货)

13、哪几种情况必须用到初始化成员列表? 初始化一个const成员。 初始化一个reference成员。 调用一个构造函数,而该函数有一组参数。...(覆盖)(override) 重写指的是在派生覆盖同名函数重写就是重写函数体,要求函数必须是虚函数且: 与函数有相同参数个数 与函数有相同参数类型函数有相同返回类型...重写要求参数列表相同,重载则要求参数列表不同,返回值不要求 重写关系,调用方法根据对象类型决定,重载根据调用时实参表与形参表对应关系来选择函数体 (3)隐藏(hide) 隐藏指的是某些情况下,派生函数屏蔽了同名函数...,如果对象类型是派生,就调用派生函数如果对象类型,就调用函数。...上图中展示了虚表和虚表指针在对象和派生对象模型,下面阐述实现多态过程: (1)编译器在发现中有虚函数时,会自动为每个含有虚函数生成一份虚表,该表是一个一维数组,虚表里保存了虚函数入口地址

2.5K40
领券