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

再探虚函数

函数模板使用 动态多态 在函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据所指对象实际类型来调用相应函数,如果对象类型是派生类,就调用派生类函数,如果对象类型是,...2、纯虚函数是在中声明函数,它在中没有定义,但要求任何派生类都要定义自己实现方法。在中实现纯虚函数方法是在函数原型后加"=0" 3、声明了纯虚函数是一个抽象。...只有在析构函数定义为虚函数时,调用操作符delete销毁指向对象指针时,才能准确调用派生类析构函数(从该级向上按序调用虚函数),才能准确销毁数据。...2、虚函数表类似一个数组,对象中存储vptr指针指向函数表。...3、虚函数存储函数地址,即虚函数元素是指向成员函数指针,而中虚函数个数在编译时期可以确定,即虚函数大小可以确定,即大小是在编译时期确定,不必动态分配内存空间存储函数表。

85220

【笔记】《C++Primer》—— 第三部分:设计者工具

重载 overload,指对一个同名方法进行了几种不同参数实现 可以将一个派生类对象转换为对象,此时派生类独有的部分将被截断,其部分被处理而派生类部分被忽略 有时我们不希望派生类独有的部分被截断则需要使用指针来调用重载函数使用指针所指成员...我们很多时候希望是我们通过将指针指向派生类,然后可以动态调用派生类函数,这时我们可以将对应函数写为虚(virtual)函数来实现,此时发生称为动态绑定 派生类可以继承多个,称为多继承...因此除了重载虚函数外最好不要让名称同名 派生类可以覆盖重载函数,但是如果派生类希望重载几个函数都在派生类中可见的话:一种方法是不覆盖任何一个重载函数或将所有重载函数都进行一次覆盖;另一种方法是为需要重载函数使用...using语句并不要指定形参列表,可以将所有重载函数都加入派生类作用域中 继承体系中,最关键通常需要定义一个虚析构函数,这样我们才能动态分配体系中对象,确保delete时能够执行正确析构函数版本...,这些实参不会被继承,而是派生类会得到多个继承构造函数,每个构造函数省略一个有默认实参形参 当我们想要把继承体系对象存放到容器中时,最好使用间接存储也就是存放指针(智能指针就更好了) 16

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

C++ 重载运算符 继承 多态 (超详细)

=demo2; //派生类对象可以初始化引用; Base *Bpo=&demo2;//派生类对象可以赋给指向对象指针;//多态实现方法 主要是派生类中一定包含中所有成员,在使用中,一定可以找到对应成员...赋值兼容应注意问题: 指向指针可以指向公有派生类对象,但不允许指向私有派生类对象。...允许将一个声明为指向指针指向其公有派生类对象,但是不能将一个声明为指向派生类对象指针指向对象。...声明为指向对象指针,当其指向公有派生类对象时,只能用它来直接访问派生类中从继承来成员,而不能直接访问公有派生类定义成员。...在编译时候能够确定对象所调用成员函数地址则为静态联编,一般调用方式; 动态联编:指的是在程序运行时候动态地进行,根据当时情况来确定调用哪个同名函数,父指针指向哪个子类,就调用哪个子类同名函数

1K21

后台开发:核心技术与应用实践 -- C++

继承与派生 声明派生类一般形式为: class 派生类名 [继承方式] 名{ 派生类新增加成员 }; 其中继承方式包括 public (公用)、 private (私有的)和 protected...同时,无论哪一种继承方式,在派生类中是不能访问私有 成员,私有成员只能被本类成员函数所访问,毕竟派生类不是同一个 构造派生类对象时,必须对数据成员、新增数据成员和成员对象数据成员进行初始化...而 虚函数 作用是允许在派生类中重新定义与类同名函数,并且可以通过指针或引用来访问派生类同名函数。...虚函数声明方式: virtual 返回类型 函数名(); 当把某个成员函数声明为虚函数后,就允许在其派生类中对该函数重新定义,赋予它新功能,且可以通过指向指针指向同一族中不同类对象,从而调用其中同名函数...纯虚函数是在中声明函数,它在中没有定义,但要求任何派生类都要定义自己实现方法。

1.3K10

C++关键知识点梳理

动态内存直接管理方式:new/delete,new在自由存储空间上分配对象内存,对象使用完毕需使用delete释放new分配对象指针指定内存空间;delete p释放对象,delete []释放p指向数组...private继承方式所有 public 成员在派生类中均为 private 属性;所有 protected 成员在派生类中均为 private 属性;所有 private 成员在派生类中不能使用...,则pb指针对象使用仍是指针对象,故调用func函数。...每个虚继承子类都有一个虚指针(占用一个指针存储空间,4字节)和虚表(不占用对象存储空间)当派生类重新定义虚函数时,则将派生类函数地址添加到虚函数表中。...当一个指针指向一个派生类对象时,虚函数指针指向派生类对象函数表。当调用虚函数时,由于派生类对象重写了派生类对应函数表项,在调用时会调用派生类函数,从而产生多态。

93230

C++基础多态(PolyMorphism)

函数派生类中定义了于相同函数使用指针指向派生类对象时,通过指针调用函数而不是派生类函数。...编译器做法不是我们期望,根据实际对象类型来判断重写函数调用,如果父指针指向是父对象则调用父中定义函数,如果父指针指向是子类对象则调用子类中定义重写函数。   ...纯虚函数是在中声明函数,它在中没有定义,但要求任何派生类都要定义自己实现方法。...同时抽象只能作为使用,其纯虚函数实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承纯虚函数,则这个派生类仍然还是一个抽象。...如果派生类中给出了纯虚函数实现,则该派生类就不再是抽象了,它是一个可以建立对象具体

46930

浅谈C++多态性

最常见使用方法就是声明基指针,利用该指针指向随意一个子类对象,调用对应函数能够依据指向子类不同而实现不同方法。...假设没有使用函数的话,即没有利用C++多态性,则利用指针调用对应函数时候,将总被限制在函数本身,而无法调用到子类中被重写过函数。...p->foo()和p->fuu()则是指针指向子类对象,正式体现多态使用方法,p->foo()因为指针是个指针指向是一个固定偏移量函数,因此此时指向就仅仅能是foo()函数代码了...并非非常理解这样使用方法,从原理上来解释,因为B是子类指针,尽管被赋予了对象地址,可是ptr->foo()在调用时候,因为地址偏移量固定,偏移量是子类对象偏移量,于是即使在指向了一个对象情况下...C++纯虚函数 一、定义 纯虚函数是在中声明函数,它在中未定义,但要求不论什么派生类都要定义自己实现方法。

36610

202452 学习笔记:继承基本概念

用继承创建对象可以调用父成员函数但要注意,派生类继承了父成员函数和成员变量,不是拷贝了一份到派生类里,而是给了派生类去父调用父函数权利。...private成员在派生类中无论以什么方式继承都是不可见。这里不可见是指私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在里面还是外面 都不能去访问它。 2....一般都是使用public/protected方式进行继承 二.派生类对象赋值转换 派生类对象可以赋值给对象 / 指针 / 引用。这里有个形象说法叫切片或者切割。...寓意把派生类中父那部分切来赋值过去。 对象不能赋值给派生类对象。 指针或者引用可以通过强制类型转换赋值给派生类指针或者引用。但是必须是 指针指向派生类对象时才是安全。...(在子类成员函数中,可以使用 ::成员 显示访问) 3. 需要注意是如果是成员函数隐藏,只需要函数名相同就构成隐藏。 4. 注意在实际中在继承体系里面最好不要定义同名成员。

10210

C++系列笔记(五)

使用函数实现多态行为 可通过Fish指针或Fish引用访问Fish对象,这种指针或引用可指向Fish、Carp等对象。但你不需要知道也不关心它们指向是哪种对象。...为什么需要虚构函数 上面的代码如果加入析构函数释放内存,对于使用new在自由储存区中实例化派生类对象,如果将其赋值给指针,并通过该指针调用delete,将不会调用派生类析构函数,这可能导致资源未释放...new在自由存储区中实例化,还是以局部变量方式在栈中实例化,构造函数和析构函数调用顺序都相同。...抽象提供了一种非常好机制,让您能够声明所有派生类都必须实现函数。抽象常被简称为ABC。ABC有助于约束程序设计。...注意:C++关键字virtual含义随上下文而异(我想这样做目的很可能是为了省事),对其含义总结如下: 在函数声明中,virtual意味着当指针指向派生对象时,通过它可调用派生类相应函数

65730

C++ Primer 学习笔记_87_用于大型程序工具 –异常处理

假设该指针是一个指向派生类对象类型指针,则那个对象将被切割,仅仅抛出部分。 谨记:抛出指向局部对象指针总是错误,因此,在抛出指针时候,必须确定进入处理代码时指针指向对象存在。...3、异常说明符与继承 像形參声明一样,异常说明符能够用于捕获派生类异常对象,并且,异常说明符静态类型决定catch子句能够运行动作。...假设被抛出异常对象是派生类类型,但由接受类型catch处理,那么,catch不能使用派生类特有的不论什么成员。...假设catch对象是类型对象而异常对象是派生类,就将异常对象切割为它子对象。 对象(相对于引用)不是多态。对象静态类型和动态类型相同,函数是虚函数也一样。...由于catch子句按出现次序匹配,所以使用来自继承层次异常程序将它们catch子句排序,以便派生类处理代码出如今其类型catch之前。

70210

纯虚函数

定义 纯虚函数就是在中声明函数,它在中没有定义,但要求任何派生类都要定义自己实现方法。...在中实现纯虚函数方法是在函数原型后面加“=0” 引入原因 方便使用多态,因此常常在中定义虚函数 在很多情况下,本身生成对象是不合理。...使用抽象时注意: 抽象只能作为使用,其纯虚函数实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承纯虚函数,则这个派生类仍然是一个抽象。...包含纯虚函数是抽象,抽象不能定义实例,但可以声明指向实现该抽象具体指针或引用。...但可以通过让友元函数调用虚拟成员函数来解决友元虚拟问题。 析构函数应当是虚函数,将调用相应对象类型析构函数。因此,如果指针指向是子类对象,将调用子类析构函数,然后自动调用析构函数

1K20

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

33、为什么析构函数一般写成虚函数 由于多态性,指针可以指向派生类对象,如果删除该指针,就会调用该指针指向派生类析构函数,而派生类析构函数又自动调用析构函数,这样整个派生类对象完全被释放...只有在析构函数定义为虚函数时,调用操作符delete销毁指向对象指针时,才能准确调用派生类析构函数(从该级向上按序调用虚函数),才能准确销毁数据。...在构造子类对象时,会先调用父构造函数,此时,编译器只“看到了”父,并为父对象初始化虚表指针,令它指向虚表;当调用子类构造函数时,为子类对象初始化虚表指针,令它指向子类虚表 (4)当派生类函数没有重写时...,派生类虚表指针指向虚表;当派生类函数重写时,派生类虚表指针指向是自身虚表;当派生类中有自己函数时,在自己虚表中将此虚函数地址添加在后面 这样指向派生类指针在运行时...上述观点看似正确,其实不然,如果虚函数在编译器就能够决定将要调用哪个函数时,就能够内联,那么什么情况下编译器可以确定要调用哪个函数呢,答案是当用对象调用虚函数(此时不具有多态性)时,就内联展开 综上,当是指向派生类指针

2.5K40

《逆袭进大厂》之C++篇49问49答

33、为什么析构函数一般写成虚函数 由于多态性,指针可以指向派生类对象,如果删除该指针,就会调用该指针指向派生类析构函数,而派生类析构函数又自动调用析构函数,这样整个派生类对象完全被释放...只有在析构函数定义为虚函数时,调用操作符delete销毁指向对象指针时,才能准确调用派生类析构函数(从该级向上按序调用虚函数),才能准确销毁数据。...在构造子类对象时,会先调用父构造函数,此时,编译器只“看到了”父,并为父对象初始化虚表指针,令它指向虚表;当调用子类构造函数时,为子类对象初始化虚表指针,令它指向子类虚表 (4)当派生类函数没有重写时...,派生类虚表指针指向虚表;当派生类函数重写时,派生类虚表指针指向是自身虚表;当派生类中有自己函数时,在自己虚表中将此虚函数地址添加在后面 这样指向派生类指针在运行时...上述观点看似正确,其实不然,如果虚函数在编译器就能够决定将要调用哪个函数时,就能够内联,那么什么情况下编译器可以确定要调用哪个函数呢,答案是当用对象调用虚函数(此时不具有多态性)时,就内联展开 综上,当是指向派生类指针

1.9K10

继承

派生类之间关系: 派生类对象可以使用(公有的)方法。 指针可以在不进行显示类型转换情况下指向派生类对象,但只能调用方法。...且该转换是可以传递,例如A,其派生类AP,AP派生类APP,则A指针或引用可以指向或引用AP对象和APP对象。 相反,我们将指针或引用转换为派生类指针或引用称为向下强制转换。...但该种转换只能使用显示类型转换,防止无意间指向派生类独有的方法或成员造成异常情况发生。...虚函数存储了为对象进行声明函数地址。通常情况下,对象包含一个指向该类中虚函数指针。...因此,如果要重新定义继承方法,则应确保与原来原型完全相同,但是如果返回类型是引用或指针,则可以修改为指向派生类引用或指针,即允许返回类型随类型变化而变化,这种特性被称为返回类型协变。

68620

【笔记】《C++Primer》—— 第15章:面向对象程序设计

任何构造函数以外非静态函数都可以是虚函数,如果声明了虚函数,那么派生类对应函数都隐式是虚函数 通过抽象,我们使用动态绑定可以实现接口与实现分离,用虚函数声明出接口,然后指针指向不同派生类实现来动态调用...如果是指针或引用转换,则只是一个指向改变 派生类构造函数需要负责所有成员初始化,尽管派生类也可以初始化继承来成员,但是这不符合通常编码思路,派生类一般在构造函数开始地方调用构造函数...这里有一个特别的,即便处理指针,此指针指向派生类,我们也不能隐式转换到这个派生类,如果中含有虚函数,我们可用用dynamic_cast强制转换 15.3 虚函数 通过对指针或引用来调用虚函数时会出现动态绑定...,对于实现内容我们一样可以使用=default简化 如果析构函数不是虚函数,则delete一个指向派生类对象指针将产生未定义行为 如果定义了虚析构函数,则一样合成移动操作将被阻止 派生类析构函数和以往一样是空函数...,最好使用间接存储也就是存放指针(智能指针就更好了),这是因为之前说到截断特性导致 我们常常定义额外容器来保存指针们 有时我们需要写好几个虚函数来处理容器中多态问题 当我们继承一个

50720

C++ 一篇搞懂继承常见特性

派生类对象中,包含着对象,而且对象存储位置位于派生类对象新增成员变量之前,相当于对象是头部。...对象 B 不但 A 对象能访问,其他需要用它对象也可以使用指针对象可以使用多态特性,指针可以指向派生链任意一个派生类。...第33-36行代码是正确派生类构造函数初始化构造函数方式,通过调用构造函数来初始化,在执行一个派生类构造函数 之前,总是先执行构造函数。...所以派生方式是 private 或 protected,则是无法像 public 派生承方式一样把派生类对象赋值、引用、指针对象。...---- || 03 派生类指针强制转换 public 派生方式情况下,派生类对象指针可以直接赋值给指针: Base *ptrBase = & objDerived; ptrBase 指向是一个

54830

C++之虚函数作用和使用方法

函数作用是允许在派生类中重新定义与类同名函数,并且可以通过指针或引用来访问派生类同名函数。 请分析例12.2。这个例子开始时没有使用函数,然后再讨论使用函数情况。...如果能够用同一种方式去调用同一族中不同类所有的同名函数,那就好了。 用虚函数就能顺利地解决这个问题。...说明:本来指针是用来指向对象,如果用它指向派生类对象,则进行指针类型转换,将派生类对象指针先转换为指针,所以指针指向派生类对象中部分。...如果在派生类中没有对函数重新定义,则派生类简单地继承其直接函数。 定义一个指向对象指针变量,并使它指向同一族中需要调用该函数对象。...通过该指针变量调用此虚函数,此时调用就是指针变量指向对象同名函数。 通过虚函数指向对象指针变量配合使用,就能方便地调用同一族中不同类同名函数,只要先用指针指向即可。

1.4K80

掌握了多态特性,写英雄联盟代码更少啦!

多态表现形式一 「派生类指针」可以赋给「指针」; 通过指针调用派生类同名「虚函数」时: 若该指针指向一个对象,那么被调用是 函数; 若该指针指向一个派生类对象,那么被调用...是不是大家觉得 pBase 指针对象虽然指向派生类对象,但是派生类里没有 fun1 成员函数,则就调用 fun1 成员函数,Base::fun1() 里又会调用 fun2 成员函数,所以输出结果是...} } this 指针作用就是指向成员函数所作用对象, 所以非静态成员函数中可以直接使用 this 来代表指向函数作用对象指针。...pBase 指针对象指向派生类对象,派生类里没有 fun1 成员函数,所以就会调用 fun1 成员函数,在Base::fun1() 成员函数体里执行 this->fun2() 时,实际上指向派生类对象...int a; }; 包含纯虚函数叫抽象 抽象只能作为来派生新使用,不能创建抽象对象 抽象指针和引用可以指向由抽象派生出来对象 A a; // 错,A

50410

C++ 面试必备:常见 C++ 面试题汇总及详细解析

对于C++程序员来说,精通指针使用是非常重要。 重写和重载区别 重写指的是在派生类中重新定义函数行为。...当某个虚函数派生类中被重新定义时,如果派生类对象调用该函数,则会覆盖掉实现,执行派生类实现代码。在进行对象多态性转换时,重写非常重要。...C++多态是指在继承关系中,子类可以重写父函数,从而使得一个指向子类对象指针能够调用子类函数而不是父函数。其底层原理涉及到虚函数表、虚指针等概念。...析构函数为何要声明为虚函数? C++析构函数声明为虚函数是为了确保在通过指针或引用删除派生类对象时,可以正确地释放派生类对象所占用内存。...如果析构函数不是虚函数,则在这种情况下只会调用析构函数,而不会调用派生类析构函数,从而可能导致内存泄漏和未定义行为。

1.9K30

C++primer学习笔记(六)

派生类继承访问控制标号【何种方式继承】无论是什么,不影响派生类使用成员,但影响使用派生类用户访问成员。使用接口继承还是实现继承对派生类用户具有重要含义。 友元关系不继承。...如果知道派生类转换【这种转换是地址赋给派生类指针】是安全【就是说心里清楚指针指向的确实是派生类】,可以使用static_cast强制编译器进行转换。...派生类指针静态类型和动态类型不一致时【指针指向派生类是时】,为保证删除指针调用合适析构函数【多态】,析构必须为virtual。...构造函数是对象动态类型确定之前运行,不需要定义为virtual。 引用、对象、指针静态类型决定了能够完成行为,动态类型有多功能也无法使用派生类应避免与成员名字冲突。...对象不支持动态绑定,指针和引用支持但使用起来麻烦,解决方法是定义包装或句柄【提供到其它接口】。像使用指针一样使用句柄而不用管理它指向对象。类似智能指针方法建立指针句柄。

1.1K20
领券