c++的重载和覆盖的关系?
答:
一. 重载(overload)
1. 重载指的是函数具有的不同的参数列表,而函数名相同的函数。重载要求参数列表必须不同,比如参数的类型不同、参数的个数不同、参数的顺序不同。
2. 如果仅仅是函数的返回值不同是没办法重载的,因为重载要求参数列表必须不同。
二. 覆盖(重写override)
1. 覆盖是存在类中,子类重写从基类继承过来的函数。函数名、返回值、参数列表都必须和基类相同。
2. 当子类的对象调用成员函数的时候,如果成员函数有被覆盖则调用子类中覆盖的版本,否则调用从基类继承过来的函数
3. 如果子类覆盖的是基类的虚函数,可以用来实现多态。
当子类重新定义基类的虚函数之后,基类指针可以根据赋给它不同子类指针动态的调用子类中的虚函数,可以做到动态绑定,这就是多态。
4. 子类覆盖基类函数的特征
(1)函数名相同、参数相同、返回值相同
(2)如果基类函数是虚函数,子类覆盖虚函数可以实现多态
三. 重载和覆盖的区别
1. 重载要求函数名相同,但是参数列表必须不同,返回值可以相同也可以不同。
覆盖要求函数名、参数列表、返回值必须相同。
2. 在类中重载是同一个类中不同成员函数之间的关系
在类中覆盖则是子类和基类之间不同成员函数之间的关系
3. 重载函数的调用是根据参数列表来决定调用哪一个函数
覆盖函数的调用是根据对象类型的不同决定调用哪一个
4. 在类中对成员函数重载是不能够实现多态
在子类中对基类虚函数的覆盖可以实现多态
如果基类函数是虚函数,那么子类重新定义就属于覆盖。
如果基类函数不是虚函数,那么子类重新定义属于隐藏基类函数。
c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆).
2,c++虚函数存储在内存的什么位置?
答:
c/c++程序所占用的内存一共分为五种:
栈区,堆区,程序代码区,全局数据区(静态区),常量区.
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中堆是两回事,分配方式倒是类似于链表。就是那些由
new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个 delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。3、全局区(静态区)(static)—全局变量和静态变量存储是放在一块,初始化全局变量和静态变量在一块区域, 未初始化全局变量和未初始化静态变量在相邻另一块区域。 - 程序结束后由系统释放。-->分别是data区,bbs区
4、常量区 —常量字符串就是放在这里。 程序结束后由系统释放-->coment区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
显而易见,虚函数表存放在全局数据区.虚函数表是全局共享的元素,即全局仅有一个,虚表在静态区,因为对每个类,所有对象共用虚表
浙公网安备 33010602011771号