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

再探函数

定义他为函数是为了允许用基类指针调用子类这个函数定义函数是为了实现一个接口,起到一个规范作用,规范继承这个类程序员必须实现这个函数。...那我现在有一个抽象类对象,要调用接口,调用哪个? ---- Q5:基类析构函数为什么要定义函数?...所以在调用基类析构函数时,派生类对象数据成员已经销毁,这个时候再调用子类函数没有任何意义。 ---- Q8:静态函数定义函数?...2、函数类似一个数组,类对象中存储vptr指针,指向函数表。...每一个函数类(或有函数派生类)都有一个函数表,该类任何对象中都放着该函数指针(可以认为这是由编译器自动添加到构造函数指令完成)。

85220

闭关多日,整理一份C++中那些重要又容易忽视细节

没用过,下次可以试试自己写一个名空间,如果是没有名字名空间,那么只能在包含那个名空间文件里面使用该名空间内部内容,类似于,静态变量、函数集合。...3、调用函数从临时位置获取这个值 返回引用返回机制是这样: 1、获取返回值 2、直接将返回值拷贝给调用函数 如果返回值不大,那就不大,如果返回值是一个结构这种比较大东西,那就比较麻烦了,能明白意思不...其实他讲低代码时候,想起来了QTUI,只要你会拖控件,就可以做出界面,代码可以后台自动生成。 而现在又有多少人,是面向百度编程。...派生类对象包含一个指向独立地址表指针。如果派生类提供了函数定义,该函数表将保存新函数地址;如果派生类没有重新定义函数,该vtbl将保存函数原始版本地址。...如果派生类定义了新函数,则该函数也将被添加到vtbl中。注意,无论类中包含函数是1个还是10个,都只需要在对象中添加1个地址成员,只是表大小不同而已。

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

【C++】多态

函数定义较为简单,只需要在函数接口部分加上virtual关键字即可,当函数所在类被继承时,派生类会隐含一个基类函数,此时如果基类重新定义这个函数,并且和基类函数参数列表,返回值,函数名都一样...协变也是函数重写特殊情况,三同中返回可以不同,但是要求返回值必须是一个父子类关系指针引用,自己父类其他父类都可以。实际并不常见,大家只要了解一下这个语法就够了。...则派生类也会继承父类BuyTicket // 建议父类子类都加上virtual // 2.协变:三同中返回可以不同,但是要求返回值必须是一个父子类关系指针引用,自己父类其他父类都可以...我们可以通过对比地址方式确定位置,从代码运行结果就可以看出,表地址和代码段地址较为相近,所以表位置极大可能性就是在代码段,另一方面去理解的话,函数本质不就是类成员函数?...5.静态成员可以函数

51520

总结

继承类似组合作用,组合是将其他类作为成员放入类中,而继承则是直接将基类成员直接继承到派生类中。...,这时候就可以采用覆盖方式修改函数内容,即在派生类定义函数定义方式与基类相同情况,则派生类中这个函数内容是派生类内容,若是再使用基类中函数,则可以采用基类::函数方式 例:class...其次是函数函数其中一个作用便是可以实现多态,在基类中定义一个函数格式为: virtual 返回类型 函数名(); 这样有这个基类产生派生类可以对virtual后函数进行定义,但定义时要和基类中定义函数方式相同...拥有纯函数类就被称为抽象类。纯函数优点是可以先不用定义函数功能,而是由派生类进行定义即可,另外要注意析构函数可以函数,但是构造函数可以。...定义方式:virtual 返回类型 函数名()=0; 函数可以实现多态,最简单一个应用则是将派生类引用传址给基类,这样基类中函数会根据派生类对应函数定义确定函数功能,主要采用是传址和引用两个方式

15210

【C++】多态

函数重写(也可以叫覆盖): 派生类中有一个跟基类完全相同函数(即派生类函数与基类函数返回值类型、函数名字、参数列表完全相同),称子类函数重写了基类函数。...但是是有要求: 基类函数必须返回基类对象指针引用,派生类函数必须返回派生类对象指针引用,我们把这种情况称为协变。...另外,这里这里返回基类派生类指针引用也可以是其它继承体系中基类和派生类。...另外上面说返回基类派生类指针引用也可以是其它继承体系中基类和派生类,什么意思呢? 那就是这样 这样也是可以 不过这个协变可能在实际中应用场景不多。 3....因此结果是B->0 那说到这里我们也顺便区分一组概念: 4. 接口继承和实现继承 普通函数继承是一种实现继承,派生类继承了基类成员函数可以使用该函数,继承函数实现。

9210

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

即基类函数返回基类对象指针或者引 用,派生类函数返回派生类对象指针或者引用时,称为协变。...,展现出不同形态 要达到多态,有两个条件,一个函数覆盖,一个是对象指针引用调用函数 满足多态以后函数调用,不是在编译时确定,是运行起来以后到该对象中取找(所以多态条件包括使用基类对象指针引用去调用...当对象调用函数时会先找到函数表,通过函数表找到对应函数,由此构成多态 inline函数可以函数?...答:可以,不过编译器会忽略inline属性,这个函数就不再是inline,因为函数要放到表中去 静态成员可以函数?...答:不能,因为静态成员函数没有this指针,使用类型::成员函数调用方式 无法访问函数表,所以静态成员函数无法放进函数表。 构造函数可以函数

44030

C++进阶-多态

协变 类函数返回基类对象指针或者引用,派生类函数返回派生类对象指针或者引用时,称为协变(基类与派生类函数返回值类型不同) 示例: class A {}; class B : public...,展现出不同形态 要达到多态,有两个条件,一个函数覆盖,一个是对象指针引用调用函数 满足多态以后函数调用,不是在编译时确定,是运行起来以后到该对象中取找(所以多态条件包括使用基类对象指针引用去调用...可以,不过编译器会忽略inline属性,这个函数就不再是inline,因为函数要放到表中去 静态成员可以函数?...不能,因为静态成员函数没有this指针,不能通过对象指针找到其函数表,使用类型::成员函数调用方式无法访问函数表,所以静态成员函数无法放进函数表 构造函数可以函数?...可以,并且最好把基类析构函数定义函数 当基类指针指向new出来基类对象new出来派生类对象时,需要使用指针进行释放对象,此时需要析构函数函数,保证指针指向对象成功释放 对象访问普通函数快还是函数更快

56530

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

}; 3.函数重写(覆盖) 派生类中有一个跟基类完全相同函数(即派生类函数与基类函数返回值类型、函数名字、参数列表完全相同) ,称子类函数重写了基类函数。...协变(基类与派生类函数返回值类型不同) 派生类重写基类函数时,与基类函数返回值类型不同。即基类函数返回基类对象指 针或者引用,派生类函数返回派生类对象指针或者引用时,称为协变。...这里父子类指针引用甚至还可以是其他父子类指针引用。...答:可以,不过编译器就忽略inline属性,这个函数就不再是 inline,因为函数要放到表中去。 2. 静态成员可以函数?...答:不能,因为静态成员函数没有this指针,使用类型::成员函数 调用方式无法访问函数表,所以静态成员函数无法放进函数表。 3. 构造函数可以函数

71050

《逆袭进大厂》第三弹之C++提高篇79问79答

(3)使用抽象类时注意: 抽象类只能作为基类来使用,其纯函数实现由派生类给出。如果派生类中没有重新定义函数,而只是继承基类函数,则这个派生类仍然还是一个抽象类。...如果派生类中给出了基类纯函数实现,则该派生类就不再是抽象类了,它是一个可以建立对象具体类。 抽象类是不能定义对象一个函数不需要(但是可以)被定义。...这就是纯函数作用。  纯函数可以让类先具有一个操作名称,而没有操作内容,让派生类在继承时再去具体地给出定义。 凡是含有纯函数类叫做抽象类。这种类不能声明对象,只是作为基类为派生类服务。...例如,绘画程序中,shape作为一个基类可以派生出圆形、矩形、正方形、梯形等, 如果要求面积总和的话,那么会可以使用一个 shape * 数组,只要依次调用派生类area()函数了。...当一个成员函数被声明为函数之后,其派生类中同名函数自动成为函数,在派生类中重新定义函数时要求函数名、返回值类型、参数个数和类型全部与基类函数相同。

2.2K30

《C++Primer》第十五章 面向对象程序设计

(但不总是)覆盖它集成函数,如果没有覆盖的话,则该函数行为类似于其他普通成员派生类会直接继承其在基类中版本 派生类可以在它覆盖函数前适用virtual关键字,但不是非得这么做 C++11...尽管从语法上来说我们可以派生类构造函数体内给它共有受保护基类成员赋值,但最好不要这么做。 2.3 继承与静态成员 如果基类定义一个静态成员,则在整个继承体系中只存在该成员唯一定义。...一般情况下派生类函数返回类型是类本身指针引用时,上述规则无效。比如D由B派生而来,则基类函数可以返回B*而派生类对应函数可以返回D*。...合成拷贝控制与继承 基类派生类合成拷贝控制成员与其他合成构造函数、赋值运算符析构函数类似:它们对类本身成员依次进行初始化、赋值销毁操作。...另外某些定义基类方式也可能导致有的派生类成员称为被删除函数: 如果基类中默认构造函数、拷贝构造函数、拷贝赋值运算析构函数是被删除函数或者不可访问,则派生类中对应成员将是被删除,原因是编译器不能使用基类成员执行派生类对象基类部分构造

1.2K20

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

有些时候我们不希望派生类独有的部分被截断,则需要使用类指针调用重载函数使用指针所指成员。...如果是指针引用转换,则只是一个指向改变 派生类构造函数需要负责所有成员初始化,尽管派生类可以初始化继承基类成员,但是这不符合通常编码思路,派生类一般在构造函数开始地方调用基类构造函数...,让基类初始化自己成员 派生类可以使用基类public成员和protected成员 如果基类定义一个静态成员,那整个继承体系中都只会有这成员唯一定义,无论派生了多少类这个成员都是唯一实例,静态成员也同样遵循访问控制原则...,那必须名称和形参都一致,否则编译器会认为这两个函数是独立,而不会产生覆盖 派生类函数返回类型也需要与基类一致,除非虚函数返回类型是类本身引用指针时为了多态性会有特例 如果想要保证基类中某个函数一定会被覆盖...15.4 抽象基类 我们有时候希望某个基类只用来被继承而不允许被实例化,这时候我们可以给这个基类加入纯函数,拥有纯函数基类叫抽象基类,不能被直接创建 纯函数定义方法是在声明函数时候函数类似显式默认构造写法改写为

50620

多态

多态定义及实现 多态是类继承时,对象去调用同一个对象产生不同行为 要构成多态条件有两个 函数重写 基类对象引用调用函数 函数重写 什么是函数?...函数重写条件 是函数,且函数名,返回类型,参数类型相同(三同) 三同,但是只有父类写virtual也构成重写 特殊情况: 其他条件相同,返回类型为父子对象指针类型也构成重写——这个也叫做协变...,就可以证明上面了。...printvf((VF*)*(int*)c, 3); return 0; } 直接看结果: 可以看出多继承有多个表,子类没有重写函数放在第一个表中 面试常见问题 inline函数可以函数...静态成员可以函数? 构造函数,拷贝构造,赋值运算符重载可以函数? 析构函数可以函数? 对象访问普通函数快还是函数函数表在什么阶段产生,存在哪里?

23220

EasyC++79,函数注意事项

这里简单做一个总结: 在基类方法声明中使用关键字virtual可以声明函数 加上了virtual关键字函数在基类以及派生类派生类再派生出来类中都是 在调用函数时,程序将会根据对象类型执行对应方法而非引用指针类型...友元 友元函数不能是函数,因为友元不是类成员,只有成员函数才能是函数。 如果我们希望友元函数也能实现类似函数功能, 我们可以在友元函数当中使用函数来解决。...没有重新定义 如果派生类当中没有重新定义函数,那么将使用该函数基类版本。如果派生类位于派生链中,如B继承了A,C继承了B这种情况,那么派生类将会使用最新函数版本。...speak,而在子类Human当中也定义一个需要传入一个string类型函数speak。...C++ Primer当中给出了两条经验规则: 如果重新定义继承方法,应该保证与原来原型完全相同,唯一例外是返回类型,如果基类返回是基类引用指针,派生类可以改成派生类引用指针: class

21210

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

多态表现形式一 「派生类指针」可以赋给「基类指针」; 通过基类指针调用基类和派生类同名「函数」时: 若该指针指向一个基类对象,那么被调用是 基类函数; 若该指针指向一个派生类对象,那么被调用...— — || 03 多态表现形式二 派生类对象可以赋给基类「引用」 通过基类引用调用基类和派生类同名「函数」时: 若该引用引用一个基类对象,那么被调 用是基类函数; 若该引用引用一个派生类对象...假设把上面的代码转换一下, 大家还觉得输出是 Base::fun2() ?...} } this 指针作用就是指向成员函数所作用对象, 所以非静态成员函数可以直接使用 this 代表指向该函数作用对象指针。...成员函数,所以调用了基类bye成员函数 ---- — 5 — 多态实现原理 「多态」关键在于通过基类指针引用调用一个函数时,编译时不能确定到底调用是基类还是派生类函数,运行时才能确定。

50310

第 15 章 面向对象程序设计

如果派生类没有覆盖其基类中某个函数,则该函数行为类似于其他普通成员派生类会直接继承其在基类中版本。 派生类可以在它覆盖函数前使用 virtual关键字,但不是非得这么做。...即使一个基类指针引用已经绑定在一个派生类对象上,也不能执行从基类向派生类转换。可以使用 dynamic_cast执行运行时安全检查 static_cast强制覆盖掉编译器检查工作。...而对于非虚函数调用是在编译时进行绑定。类似的,通过对象进行函数函数非虚函数)调用也在编译时绑定。 一旦某个函数被声明为函数,则在所有派生类中它都是函数。...而对于派生类中覆盖函数,其形参必须相同,返回类型也要与基类匹配。而当函数返回类型是类本身指针引用且可进行类型转换时,也是允许。 ?...基类友元在访问派生类成员时不具特殊性,类似的,派生类友元也不能随意访问基类成员。但是基类友元是可以访问内嵌在派生类对象中基类成员

1K30

常见c和cpp面试题目汇总(一)

封装隐藏了实现细节,使得代码模块化;派生类可以继承父类数据和方法,扩展了已经存在模块,实现了代码重用;多态则是“一个接口,多种实现”,通过派生类重写父类函数,实现了接口重用。...[]会调用每个成员析构函数 用new分配内存用delete释放,用new[]分配内存用delete[]释放 八、STL库用过?...,还没有内存空间,更没有函数表地址用来调用函数即构造函数了 2、析构函数最好声明为函数 首先析构函数可以函数,当析构一个指向派生类基类指针时,最好将基类析构函数声明为函数,否则可以存在内存泄露问题...因为引用(指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定关键。用引用(指针)调用函数在运行时确定,被调用函数是引用(指针)所指对象实际类型所定义。...例如,被函数返回引用只是作为一 个临时变量出现,而没有被赋予一个实际变量,那么这个引用所指向空间(由new分配)就无法释放,造成memory leak 3)可以返回成员引用,但是最好是const

1.2K31

封装、继承、多态、重载:C++中强大特性与代码设计

在C++中,使用关键字classstruct定义一个类,并使用关键字public、privateprotected指定成员访问权限。...通过继承,派生类可以继承基类接口和实现,并且可以添加自己功能修改基类行为。 继承是面对对象主要特性之一,它使一个可以从现有类中派生,而不必重新定义一个类。...dynamic_cast用于将基类指针引用转换为派生类指针引用,如果转换成功,返回指向派生类指针引用;如果转换失败,则返回空指针抛出bad_cast异常。...只有通过基类指针引用调用函数才能引发动态绑定 函数不能声明为静态 如果一个类要做为多态基类,要将析构函数定义函数 表指针 函数动态绑定是通过实现 包含函数类头4个字节存放指向指针...派生类中必须实现基类中函数,否则被看做一个抽象类 对于一个没有任何接口类,如果想要将它定义成抽象类,只能将虚构函数声明为纯 通常情况下在基类中纯函数不需要实现,例外是纯析构函数要给出实现

21510

总结继承和多态一些问题

2.区分表和表指针生成阶段 表是在编译阶段就生成了,而表指针是在构造函数初始化列表阶段初始化。这也侧面回答了下一个问题。 3.构造函可以函数?...切片: 我们都知道,多态条件是函数重写和必须通过基类指针或者引用调用函数。。那么为什么一定是需要基类指针引用呢? 先来看看不用指针引用,也就是使用基类对象调用函数。...内联函数可以写成函数,不过写出函数后,这个内联函数就不是内联函数了。 6.静态成员可以函数?...不能,因为静态成员函数没有this指针,使用类型::成员函数调用方式无法访问函数表,所以静态成员函数无法放进函数表。 7.析构函数可以函数? 基类析构函数最好是函数。...另外,纯函数可以函数实体,但是没必要。 抽象类作用是强制重写函数。另外抽象类体现出了接口继承关系 大家如果还有什么问题需要补充的话可以评论告诉哦!

43620

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

派生类中重新定义基类中函数时,可以不用关键字 virtual修饰这个成员函数函数是用关键字virtual修饰某基类中protectedpublic成员函数。...它可以派生类中重新定义,以形成不同版本。只有在程序执行过 程中,依据指针具体指向哪个类对象,依据引用哪个类对象,才能确定激活哪一个版本,实现动态聚束。...关于函数,说明以下几点: 1、当在基类中把成员函数定义函数后,在其派生类定义函数必须与基类中函数同名,参数类型、顺序、参数个数必须一一对应,函数返回类型也相同。...3、函数必须是类一个成员函数,不能是友元函数,也不能是静态 成员函数。 4、在派生类中没有重新定义函数时,与一般成员函数一样,当调 用这种派生类对象函数时,则调用其基类中函数。...指向类成员指针 在C++中可以定义一种特殊指针,它指向类中成员函数类中数据成员。并 可通过这样指针来使用类中数据成员调用类中成员函数

78120

C++:深入理解多态

,调用这个类型成员函数 2、满足多态 -- 看指向对象类型,调用这个类型成员函数 满足多态: 不满足多态: 思考:你可能会有这样疑惑->直接用在函数体里面用if……else不也可以达到这样效果...2.2 函数重写 函数:即被virtual修饰成员函数称为函数 函数重写(覆盖):派生类中有一个跟基类完全相同函数(即派生类函数与基类函数返回值类型、函数名字、参数列表完全相同...纯函数规范了派生类必须重写,另外纯函数更体现出了接口继承。 在生活中一个类型在现实中没有对应实体,我们就可以一个定义为抽象类!...在C++中,常常通过声明顺序代表实际顺序,比如说 1、初始化列表初始化顺序取决于成员变量定义先后顺序 2、一个子类继承多个父类时候,内存中先继承父类成员变量在前面,后继承父类成员变量再后面...静态成员可以函数? 答:不能,因为静态成员函数没有this指针,使用类型::成员函数调用方式无法访问函数表,所以静态成员函数无法放进函数表。 6. 构造函数、拷贝构造可以函数

6000
领券