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

【C++】多态

如果要其他平台下,部分代码需要改动。比如:如果是x64程序,则需要考虑指针是8bytes问题等等。 1....那我现在这样写: 两个类不动,把main函数改成这样 注意两个指针都是Person*,一个指向父类对象,一个指向子类对象,这样赋值是没问题,然后我们运行 大家看这次析构调用有没有问题...抽象类 接下来我们再来学一个东西叫做抽象类,先来了解一下它概念: 在虚函数后面写上 =0 ,则这个函数为纯虚函数(不需要函数体)。包含纯虚函数类叫做抽象类抽象类不能实例化出对象。...可以认为如果一个类在现实没有对应实体,我们就可以把它定义成一个抽象类。...我们继续: 另外上面还说到抽象类被继承后子类也不能实例化出对象: 因为这里子类还是一个抽象类,它也包含纯虚函数,是它继承下来嘛。

9310

virtual

实例一个该类子类对象时候,如果该类子类没有定义虚函数,但是却从父类中继承了虚函数,所以在实例化该类子类对象时候也会产生一个虚函数表,这个虚函数表是子类虚函数表,但是记录子类虚函数地址却是与父类是一样...原理: 如果父类当中定义了虚析构函数,那么父类析构函数表当中就会有一个父类虚析构函数指针指向是父类虚析构函数,子类虚析构函数表当中也会产生一个子类虚析构函数入口指针指向子类虚析构函数...纯虚函数实现原理 在虚函数原理基础上,虚函数表,虚函数地址是一个有意义值,如果是纯虚函数就实实在在一个0 含有纯虚函数类被称为抽象类 含有纯虚函数类被称为抽象类。...哪怕类只有一个纯虚函数,那么这个类也是一个抽象类,纯虚函数没有函数体,所以抽象类不允许实例化对象,抽象类子类也可以是一个抽象类。...抽象子类只有把抽象类中所有纯虚函数都做了实现才可以实例化对象。 仅含有纯虚函数类称为接口类 如果抽象类仅含有纯虚函数而不含其他东西,我们称之为接口类。

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

c++ 深入理解虚函数

这样就可以达到预期结果了 多态存在问题 [-:>内存泄漏,一个很严重问题 例如上面的程序如果在圆形定义一个圆心坐标,并且坐标是在堆申请内存,则在mian函数通过父类指针操作子类对象成员函数时候是没有问题...当实例一个该类子类对象时候,(如果)该类子类并没有定义虚函数,但是却从父类中继承了虚函数,所以在实例化该类子类对象时候也会产生一个虚函数表,这个虚函数表是子类虚函数表,但是记录子类虚函数地址却是与父类是一样...原理:         如果父类当中定义了虚析构函数,那么父类虚函数表当中就会有一个父类虚析构函数入口指针指向是父类虚析构函数,子类虚函数表当中也会产生一个子类虚析构函数入口指针指向子类虚析构函数...含有纯虚函数类被称为抽象类       含有纯虚函数类被称为抽象类,比如上面代码类就是一个抽象类,包含一个计算周长纯虚函数。...哪怕只有一个纯虚函数,那么这个类也是一个抽象类,纯虚函数没有函数体,所以抽象类不允许实例化对象,抽象类子类也可以是一个抽象类抽象类子类只有把抽象类当中所有的纯虚函数都做了实现才可以实例化对象。

1.6K60

Java 学习笔记(7)——接口与多态

当时学习C++时对多态有一个非常精炼定义:基类指针指向不同派生类,其行为不同。这里行为不同指的是调用同一个虚函数时,会调用不同派生类函数。...这里我们说形成多态几个基本条件:1)指针或者引用类型是基类;2)需要指向派生类;3)调用函数必须是基类重写函数。...= new Child(); obj.sayHello(); 这个例子也不满足多态,它使用子类引用指向子类,这里就是一个正常类方法调用,它会调用子类方法 那么多态有什么好处呢?...为什么要进行小转大呢?虽然多态给了我们很大方便,但是多态最大问题就是父类引用无法看到子类成员,也就是无法使用子类成员。这个时候如果要使用子类成员就必须进行小转大操作。...,但是有抽象方法一定要是抽象类 接口 接口就是一套公共规范标准,只要符合标准就能通用,比如说USB接口,只要一个设备使用了USB接口,那么电脑不管你设备是什么,插上就应该能用。

75440

php面试之面向对象相关知识(下篇)

所以,this就是指向当前对象实例指针,不指向任何其他对象或类。...>上述示例,在第4行定义了一个静态变量 3.parent关键字 parent是指向父类指针,一般使用parent来调用父类构造函数。 <?...抽象类应用定义如下: abstract class ClassName{ } 抽象类具有以下特点: 1)定义一些方法,子类必须实现父类所有的抽象方法,只有这样,子类才能被实例化,否则子类还是一个抽象类...2)抽象类不能被实例化,它意义在于被扩展。 3)抽象方法不必实现具体功能,由子类来完成。...5)如果抽象方法有参数,那么子类实现也必须有相同参数个数,必须匹配。

54520

【C++】多态

指针指向就是子类父类那一部分。...如果一个虚函数在接口后面加上=0,则这个虚函数为纯虚函数,纯虚函数所在类为抽象类抽象类是不可以被实例化出对象如果抽象类被继承,派生类里面天然就会有纯虚函数,那么派生类也就变成了抽象类一个如果连对象都实例化不出来...当一个类里面出现虚函数时,这个类实例化出对象模型就会发生改变,他类成员除变量之外,还会多一个虚表指针,这个虚表指针指向一个数组,这个数组里面存放是类里面虚函数地址。...需要说清楚一个概念是,虚表存是虚函数指针,不是虚函数,虚函数和普通函数一样,都是存在代码段,只是他指针又存到了虚表。另外对象不是虚表,存是虚表指针 3....一般来说,虚基类成员都放在逻辑对象模型成员最下面,如果是在内存里面的话,他位置应该是对象成员最高地址处。 11.什么抽象类抽象类作用?

51620

虚析构与纯虚析构(C++)

,则该类被称为抽象类抽象类具有以下特点: 抽象类无法实例化对象 抽象类子类必须重写父类纯虚函数,否则也为抽象类 目的 纯虚函数和抽象类存在是为了更好契合多态思想。...关于多态,简而言之就是用父类指针指向子类实例,然后通过父类指针调用实际子类成员函数 问题 纯虚函数使用也会带来某些问题,由于实际调用时是父类指针指向子类对象,因此如果子类开辟了堆区数据,...在析构时父类指针无法指向子类对象,即子类析构函数不能够正常被调用,这会带来内存泄漏问题。...虚析构与纯虚析构 虚析构 虚析构实现与虚函数一致,只需要在父类析构函数前面加上virtual关键字即可,只需要将前面代码Animal基类改成: class Animal { public:...拥有纯虚析构类也叫做抽象类,无法实例化对象。

53920

C++基础(七).多态(1)

;可以用父类指针指向子类实例(对象),然后通过父类指针调用实际子类成员函数 多态是通过虚函数实现 多态可以让父类指针有“多种形态”,这是一种泛型技术(所谓泛型技术,就是试图使用不变代码来实现可变算法...如果在派生类没有对虚函数重新定义,则它继承其基类虚函数 虚函数可以让成员函数操作一般化,用基类指针指向不同派生类对象时,基类虚成员函数调用基类指针,则会调用其真正指向对象成员函数,而不是基类定义成员函数...若不是虚函数,则不管基类指针指向哪个派生类对象,调用时都会调用基类定义那个函数 Tip: 虚函数引入就是为了实现多态特性,让不同子类可以有不同实现方式 ---- 纯虚函数 纯虚函数是一种特殊虚函数...,则把它声明为纯虚函数,它实现留给该基类派生类去做 纯虚函数作用是为派生类提供一个一致接口(纯虚函数相当于接口,不能直接实例化,需要派生类来实现函数定义) ---- 虚函数与纯虚函数区别 1)...如果派生类给出了基类纯虚函数实现,则该派生类就不再是抽象类了,它是一个可以建立对象具体类了 抽象类,既可以有抽象方法,也可以有具体方法或者叫非抽象方法。

46820

【ES三周年】C++多态

通过之前学习内容,我们可以了解到,如果没有成员变量,只有成员函数,会留一个字节进行占位,因为成员函数在代码段,所以Base1大小是1吗?...VFptr(全程vftable)是一个指针, 指向虚表,虚表是虚函数地址。...当子类也有虚函数时,这时子类虚函数放到第一个继承父类虚表,我们可以从上面代码结果看出。 ---- 再来练习题目: 下列输出结果是什么?...在有虚函数实例,this指针调用vptr指针指向是vtable(虚函数列表),通过虚函数列表找到需要调用虚函数地址。...什么抽象类抽象类作用? 抽象类是在虚函数后面写上=0,它强制必须重写子类虚函数,不写就不可以实例化出对象,另外抽象类体现出了接口继承关系。

384100

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

通过之前学习内容,我们可以了解到,如果没有成员变量,只有成员函数,会留一个字节进行占位,因为成员函数在代码段,所以Base1大小是1吗?...VFptr(全程vftable)是一个指针, 指向虚表,虚表是虚函数地址。...当子类也有虚函数时,这时子类虚函数放到第一个继承父类虚表,我们可以从上面代码结果看出。 ---- 再来练习题目: 下列输出结果是什么?...在有虚函数实例,this指针调用vptr指针指向是vtable(虚函数列表),通过虚函数列表找到需要调用虚函数地址。...什么抽象类抽象类作用? 抽象类是在虚函数后面写上=0,它强制必须重写子类虚函数,不写就不可以实例化出对象,另外抽象类体现出了接口继承关系。

33130

C++纯虚函数与抽象类

如果不定义虚析构函数,当删除一个指向派生类对象指针时,会调用基类析构函数,派生类析构函数未被调用,造成内存泄露。...这张表解决了继承、覆盖问题,保证使用指向子类对象实体基类指针或引用,能够访问到对象实际虚函数。...在有虚函数类实例,分配了指向这个表指针内存,所以,当用父类指针来操作一个子类对象实体时候,这张虚函数表就指明了实际所应该被调用虚函数。...2.纯虚函数与抽象类 既然有了虚函数,那为什么需要有纯虚函数呢?在Java编程语言中有接口定义,在C++虽然没有接口关键字,但是纯虚函数就完成了接口功能。...所以纯虚函数声明就是在告诉子类设计者,“你必须实现这个函数,但我不知道你会怎样实现它”。 值得特别注意是,由于抽象类至少有一个函数没有实现,所以抽象类无法被实例化,否则编译器会报错。

1.5K20

C++重要知识点小结---2

这种类成为抽象类一个抽象类至少具有一个纯虚函数。所谓纯虚函数是指被标明为不具体实现虚成员函数。...该声明是为派生类而保留位置。 一个抽象类不能有实例对象,即不能由该类抽象来制造一个对象。 纯虚函数是在基类子类保留一个位置,以便子类用自己实在函数定义来重载之。...在派生类中允许重载基类成员函数。如果基类函数是虚函数,当使用指针或引用访问对象时,将基于实际运行时指针指向对象类型来调用派生类函数。...因为每个存在虚函数类都要有一个4字节指针指向自己虚函数表,所以每种情况类a所占字节数应该是没有什么问题 ,那么类b字节数怎么算呢?...Range 指针指向,当调用 getRange方法,动态找到相应 Square 和 Circle 实例getRange方法进行调用。

79570

C++重要知识点小结---2

这种类成为抽象类一个抽象类至少具有一个纯虚函数。所谓纯虚函数是指被标明为不具体实现虚成员函数。...该声明是为派生类而保留位置。 一个抽象类不能有实例对象,即不能由该类抽象来制造一个对象。 纯虚函数是在基类子类保留一个位置,以便子类用自己实在函数定义来重载之。...在派生类中允许重载基类成员函数。如果基类函数是虚函数,当使用指针或引用访问对象时,将基于实际运行时指针指向对象类型来调用派生类函数。...因为每个存在虚函数类都要有一个4字节指针指向自己虚函数表,所以每种情况类a所占字节数应该是没有什么问题 ,那么类b字节数怎么算呢?...Range 指针指向,当调用 getRange方法,动态找到相应 Square 和 Circle 实例getRange方法进行调用。

68570

多态

纯虚函数——虚函数后面加上一个=0 抽象类就是抽象,即**不能实例化出来对象。**派生类继承了也不能实例化出来对象,必要要进行重写,才能实例化出来对象。...虚函数放在虚函数表,所以虚函数都放在学函数表 类中有个虚函数表指针指向这个表,在vs2019,这个指针为vfptr cppclass teacher { public: virtual...这也是为什么说,指向哪里调哪里——父类指针或引用指向父类调父类,指向子类子类。...想打印出来它,就要先取到他地址,然后还要知道它是什么类型? 取到它地址 直接取对象地址就可以,虚表指针都放在对象一个位置 什么类型?...虚表指针它是一个函数指针数组指针什么意思呢?——它是一个指针,它指向一个数组,数组每个元素都是一个函数指针

23220

再探虚函数

如果说,抽象类无法实例化对象,那就无法使用对象方法了嘛。...那我现在有一个抽象类对象,要调用接口,调用哪个? ---- Q5:基类析构函数为什么要定义成虚函数?...vptr是一个指针,在类构造函数创建生成,并且只能用this指针来访问它,因为它是类一个成员,并且vptr指向保存虚函数地址vtable.对于静态成员函数,它没有this指针,所以无法访问vptr...2、虚函数表类似一个数组,类对象存储vptr指针指向虚函数表。...多态函数调用语句被编译成根据基类指针指向(或基类引用所引用)对象存放虚函数表地址,在虚函数表查找虚函数地址,并调用虚函数一系列指令。

85220

三大特性之多态

多态构成必须要满足两个条件: 1.必须要通过父类引用或者指针作为形参来调用 为什么一定要是父类引用或者指针,对于这个问题《深度探索C++模型》这样说:“一个pointer或一个reference...如果定义了一个子类对象,并将该子类对象赋值给一个父类指针,当我释放父类时候只会调用父类析构函数,也就是说只释放了子类父类那一部分资源,而没有释放子类资源,这就可能会导致内存泄漏。...如果一个类包含纯虚函数,那么这个类就是抽象类抽象类不能实例化对象,并且如果继承抽象类子类不对纯虚函数进行重写的话,子类也是一个抽象类无法实例化对象。...但这个类大小为4字节 这是因为如果一个类中有虚函数,那么该类中会有一个隐藏指针,该指针指向一个虚函数表。...如果指针对象或者是引用对象,则调用普通函数快,因为构成多态,运行时调用虚函数需要到虚函数表中去查找。 虚函数表是在什么阶段生成,存在哪

16420

C#简单面试题目(一)

如果该函数是实函数,则调用该指针或引用成员函数;如果该函数是虚函数,则调用该指针或引用指向对象成员函数。...而抽象类可以有方法实现,也可以定义非静态类变量。抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。抽象了可以提供某些方法部分实现,接口不可以。抽象类实例是它子类给出。...接口实例是实现接口类给出。在抽象类假如一个方法,那么它子类就同时有了这个方法。而在接口中加入新方法,那么实现它类就要重新编写(这就是为什么说接口是一个规范了)。...12.何时必须声明一个类为抽象类?   当这个类包含抽象方法时,或是该类并没有完全实现父类抽象方法时。 13.为什么不能指定接口中方法修饰符?   ...接口中方法用来定义对象之间通信契约,指定接口中方法为私有或保护没有意义。他们默认为共有方法。 14.如果接口中存在重复方法名称该如何?   这种情况你可以决定如何实现,当然需要特别的小心。

95230

深入解析C++虚函数和虚继承:实现多态性与继承关系高级特性

动态多态使用:父类指针或引用 指向子类对象 重写:函数返回值类型 函数名 参数列表 完全一致叫重写 如果子类没有堆区数据,可以不用写虚析构和纯虚析构。...1.虚析构与纯虚析构共性: 解决父类指针释放子类对象不干净问题 都需要有具体函数实现 2.区别: 如果是纯虚析构,该类属于抽象类,无法实例化 .虚析构语法: virtual ~类名(){}...指向子类对象发生多态 */ class base { public: //纯虚数 // 子类内容会覆盖父类,所以父类函数没有意义了 //类只要有一个纯虚函数就称为抽象类 virtual...抽象类只能作为基类派生出子类,而不能在程序中被实例化(不能声明抽象类对象),但是可以指向抽象类指针。...它是实现抽象类和多态性重要机制之一。 如果某个函数不是抽象类成员函数,不能用基类指针调用。

96510

C++多态之析构和纯虚析构分析与示例

虚析构和纯虚析构 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类析构代码 解决方式:将父类析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: 可以解决父类指针释放子类对象...都需要有具体函数实现 虚析构和纯虚析构区别: 如果是纯虚析构,该类属于抽象类,无法实例化对象 虚析构语法: virtual ~类名(){} 纯虚析构语法: virtual ~类名() = 0; 类名...问题产生原因:因为是用父类指针指向子类对象Animal *animal = new Cat("Tom");所以当用delete父类指针时不会走子类析构,导致子类如果有堆区数据会出现内存泄露情况...<< endl; } //和包含普通纯虚函数类一样,包含了纯虚析构函数类也是一个抽象类。不能够被实例化。...虚析构或纯虚析构就是用来解决通过父类指针释放子类对象 ​ 2. 如果子类没有堆区数据,可以不写为虚析构或纯虚析构 ​ 3. 拥有纯虚析构函数类也属于抽象类

42410

CC++面试常问题集(2)

纯虚函数 函数声明时候=0 没有方法实体是纯虚函数 当类中有一个纯虚函数,这个类也称为抽象类抽象类特点: 无法实例化对象。...子类必须重写抽象类纯虚函数,否则子类也属于抽象类,也无法实例化对象。 image.png 接口类 概念:仅含有纯虚函数类称为接口类。 没有任何数据成员,只有成员函数,而且成员函数都是纯虚函数。...传参是子类。 可以使用接口类指针指向子类对象,并调用子类对象实现接口类纯虚函数。 不能使用接口类实例化对象。 10、解释静态绑定和动态绑定?...只有虚函数才使用是动态绑定,其他全部是静态绑定 11、指针和引用定义和性质区别: 指针和引用存放都是所指对象地址 (1)指针指针一个变量,只不过这个变量存储一个地址,指向内存一个存储单元...如果你在用delete时没用括号,delete就会认为指向是单个对象,否则,它就会认为指向一个数组。

1.1K10
领券