杨泽彬的神秘商店

博客园 首页 新随笔 联系 订阅 管理
  71 随笔 :: 0 文章 :: 0 评论 :: 7674 阅读

多态指一种接口多种实现

可参考文章:[多态冷知识]:https://blog.csdn.net/weixin_46052798/article/details/116586481

1. 多态的实现有哪几种?

a.静态多态:在编译期间实现,通过模板和重载实现
b.动态多态:在运行期间实现,通过虚函数和继承实现,执行动态绑定

2.如何实现动态绑定?

1.维护虚表(指针数组) 每个类维护一张虚表
2.对象拥有虚表指针 虚表指针是每个对象都拥有一个
经过虚表调用虚函数的过程称为动态绑定
程序在执行p->vfunc1()时,会发现p是个指针,且调用的函数是虚函数

void test(){
B bObject;
A *p = &bObject;
p->vfun1();//vfun1()是B类重写的A基类虚函数
}

3. 动态绑定的三个条件是什么?

  • 使用指针访问函数
  • 指针必须是upcast类型
  • 访问的是虚函数

4. upcast 和 downcast 和 dynamic_cast 指什么?

upcast 指上行转换(向上类型转换):其实就是子类向基类转换。
downcast 指下行转换(向下类型转换):其实就是基类向子类转换。

upcast 直接赋值会带来slice(切割)现象。

4.1为什么有了C语言的强制类型转换还需要c++的强制类型转换?

c++的强制类型转换更加明确(易读)。

4.2static_cast 与 dynamic_cast 的区别是什么?

5. 动态多态的必要条件是什么?

需要有继承关系 需要有子类重写父类虚函数 需要有基类指针/引用访问子类虚函数

6. 函数重载与函数重写与函数隐藏的区别

不是一个概念的东西。
函数重载:同名函数不同参数实现多个功能一致,输入参数不同的函数
函数重写:派生类虚函数覆盖基类同名虚函数
函数隐藏:派生类出现与基类一模一样的函数,派生类使用时默认隐藏基类的函数

7. 函数重载的底层实现原理

函数重载是在编译器链接阶段通过函数名修饰规则创建多个函数地址的:根据形参来修饰函数名
g++的函数名修饰规则:_Z+函数名长度+函数名+参数首字母。

8. extern "C"修饰的函数会怎样?

编译器会以C语言的规则对其进行编译。

9. 返回值不同能构成函数重载吗?

从函数名修饰规则中可以看出,函数名修饰与函数的返回值无关,所以返回值不同的话就不能构成函数重载。

10. 析构函数能函数重载吗?

不能,析构函数只能有一个,析构函数不能带参数。

11.析构函数可以是虚函数吗?

可以,并且析构函数一般写成虚函数。对于基类来说。

  • .析构函数可以为虚函数,并且一般情况下基类析构函数要定义为虚函数。
  • .只有在基类析构函数定义为虚函数时,调用操作符delete销毁指向对象的基类指针时,才能准确调 用派生类的析构函数(从该级向上按序调用虚函数),才能准确销毁数据。

12.构造函数可以是虚函数吗?

构造函数不能是虚函数 因为虚函数表本省需要对象实体,二者自相矛盾了。

13.构造函数

14.虚函数表存在哪个地方?

某个类的虚函数表只有一个,是全局变量,因为虚函数表是一个指针数组,不是代码,因此不可能存在代码区。
虚函数表的大小在编译期就能确定,不需要动态分配内存,所以不在堆中。
在全局变量区。

15.纯虚函数与虚函数有哪些区别?

定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。
纯虚函数不实现,虚函数必须实现。

16.友元函数可以是虚函数吗?

友元不是成员函数,只有成员函数才可以是虚拟的,因此友元不能是虚拟函数。但可以通过让友元函数调用虚拟成员函数来解决友元的虚拟问题。

posted on   快乐过了阈值  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示