当前位置: 首页 > news >正文

浅谈为什么多态只能是指针或引用

其实在很早之前,我一直没有注意到这个问题,直到今天碰见了一道题,顺便前面的博客中,继承写到,子类中不包含父类,子类只是继承了父类的成员变量和函数,由这一点,引发了我对切片以及赋值的疑惑,为什么只有指针和引用才可以发生多态呢?

那么很多人可能想说的是,这不就是概念吗,也就是说C++委员会定标准就是这样定的,其实我想说的是,如果看过我上一篇内容的朋友,应该也会想到这个问题。如下:

B继承了A,但是其实B中不包含A的,只不过是B中有了A的成员函数和一些成员变量,但是如果此时A中有虚函数呢?那么此时B中就会发生重写,也就是覆盖,会有虚函数表指针,但是我想说的是,我们在继承中学习过切片,切片是不牵扯类型转换什么的,但是你想过类似于下面的代码吗?

因为B继承了A,所以此时的B的虚函数指针指向的虚函数表与A不同,但是此时这里发生了切片,如果就像我们平时所说的,切片没有发生类型转换,只是将B类中A的那部分赋值给A的对象,那么此时按道理说赋值给A的对象的那个虚函数表,此时应该是B中重写之后的。但是不是,我们可以看看结果。

他既然是没有重写之前的,怎么会回事,难道B中,没有重写吗?其实不是的。在这里有两种说法:第一:在赋值拷贝的时候,不拷贝虚函数表指针。这样的话,A就是用的自己的虚函数表指针。所以此时打印出来就是没有重写的.(这种说法也是我的老师说的)。

第二:因为在切片的时候,其实是发生了浅拷贝的,所以此时因该是A的对象与B的对象一样,不仅一样,如果他们中有指针,还是两个指针指向同一个地址的,但是这里明显没有,所以只有一个解释,那就是B在发生切片的时候,B的虚函数指针指向发生了变化。所以这里有小小的隐式类型转换。(此方法是上网查询,唯一能解释的通的,且自己明白的说法)

而引用和指针其实是一个道理,拿指针来说,把子类对象地址的开头给父类指针,所以这里也没办法变啊,引用也是一个道理,引用就是起别名,他是给子类对象中父类的成员函数,变量等起了一个别名,这个怎么变啊?所以,这样的话,就相当于是可以发生多态。

对此,大家有什么看法吗?

http://www.lryc.cn/news/174597.html

相关文章:

  • js看代码说输出
  • Java笔记:使用javassist修改class文件内方法
  • 华为云云耀云服务器L实例评测 |云服务器性能评测
  • iphone的safari浏览器实现全屏的pwa模式,并修改顶部状态栏背景颜色
  • springboot对接rabbitmq并且实现动态创建队列和消费
  • Spring的后处理器-BeanFactoryPostprocessor
  • Flutter 必备知识点
  • 什么是FMEA(失效模式和影响分析)?
  • Redis面试题(三)
  • Python错误处理指南:优雅应对异常情况
  • MySQL学习笔记12
  • 【owt】构建m79的owt-client-native:使用vs2017
  • Cpp/Qt-day020918Qt
  • Spring面试题10:Spring的XMLBeanFactory怎么使用
  • 自定义数据类型
  • 产品团队的需求验证和确认
  • 【JVM】类加载的过程
  • Golang 结构化日志包 log/slog 详解(四):分组、上下文和属性值类型
  • 小白学Python:提取Word中的所有图片,只需要1行代码
  • pip修改位于用户目录下的缓存目录
  • 更新、修改
  • 山西电力市场日前价格预测【2023-09-25】
  • 从collections库的Counter类看items()方法和enumerate()方法
  • 2023-09-24 LeetCode每日一题(LRU 缓存)
  • 《计算机视觉中的多视图几何》笔记(10)
  • 【一、虚拟机vmware安装】
  • uniapp 离线打包 plus.runtime.install 安装页面不弹起
  • Docker 自动化部署(保姆级教程)
  • 北工大汇编题——分支程序设计
  • 贴片电容耐压值选取和特性(包含实际电路和PCB)