前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日一问(11) 什么是虚函数

每日一问(11) 什么是虚函数

作者头像
程序员小王
发布2021-02-03 11:49:52
4620
发布2021-02-03 11:49:52
举报
文章被收录于专栏:架构说架构说

故事

这是餐桌上一个必点菜,大家都知道,根本不是独家秘笈, 但是看了无数次文章和book,依然完全被锤,停留 表面上,完全不知道对方在想什么,

其实很简单,就这样呀。

感觉没问题就是最大的问题。

无论任何公司阿里,滴滴,还有腾讯,还是普通公司

都上这个菜,这就是一条线索,故事的线索。

别人都知道,我不知道 才是最尴尬的地方

C++通过指针实现了多态,运行时函数重载决议, 是他最有优秀地方,但是也是最让人痛苦地方, 内存模型假设存在 让对象生命周期管理更加复杂。异常总是在看不到地方出现。怎么办? 然后出现了智能指针,这能说拆东墙补西墙吗? 为了保证正确拷贝赋值, 虚指针和智能指针在类型转换 采取哪些措施保证唯一或者正确 , 这可能是隐藏的副本,boss任务。

我需要你必须重视起来,思想上重视就是口号,必须采取行动 必须阅读

  • RocksDB是使用C++编写的嵌入式kv存储引擎 和
  • Protocol buffers

看到别人是怎么用的,从这里开始,

简述C++虚函数作用及底层实现原理(牛客)

思考:复制操作和虚函数有关系吗?

问题1:什么复制拷贝

问题2:默认拷贝对虚函数做了什么

从汇编看c++中临时对象的析构时机

参考 https://blog.csdn.net/chaoguo1234/article/details/81277613

问:系统自动合成的default copy assignment operator对虚函数有什么操作?

A class does not exhibit bitwise copy semantics for the default copy assignment operator:

When the class declares one or more virtual functions (we must not copy the vptr address of the right- hand class object, since it might be a derived class object)

问题3:什么是move copy

标准库:如何使用

  • 自定义一个类:如何使用

疑问:既然虚函数表,在编译时候确定了,并且放到只读数据段,问题来了,如果继承重写需要修改里面函数地址给怎办?并且不同对象 this不一样,虚函数表 只读数据段 怎么确定 每个对象函数运行地址怎么共用呀?这不是自相矛盾? https://maimai.cn/web/gossip_detail?gid=28548835&egid=f9572a925d4d11ebbb08801844e2d86c

使用gdb探索 C++ 虚函数表

不同对象,创建不同的虚指针吗?创建不同的虚函数表吗?,

一个类可以创建多个对象 在创建对象时,编译系统只为对象中的成员数据(成员变量)分配内存空间 而同类对象的成员函数的代码却是共享的。

内部的成员函数:普通函数:不占用内存。虚函数:要占用4个字节,用来指定虚函数的虚拟函数表的入口地址。所以一个类的虚函数所占用的地址是不变的.

代码语言:javascript
复制
set print object on
(gdb) n
39      Derived d; 
(gdb) n
40      Derived d1; 
 
(gdb) p d
$1 = (Derived) {<Base> = {
    _vptr.Base = 0x555555755d48 <vtable for Derived+16>}, <No data fields>}
(gdb) p d1
$2 = (Derived) {<Base> = {
    _vptr.Base = 0x555555755d48 <vtable for Derived+16>}, <No data fields>}
(gdb) 

(gdb) p /a *((void**)0x555555755d48)
(gdb) shel c++filt _ZTI7Derived
typeinfo for Derived

虚函数的间接调用

只有对于通过指针或引用的方式调用虚函数才是间接调用 普通方法的调用是直接将地址写在调用位置的,称作直接调用 ; 那在有了virtual关键字之后再通过指针或引用调用 时,编译器在编译时肯定不会直接写,因为它需要查表才能知道要调用哪个方法,所以称作间接调用 ,需要注意,只有通过指针或引用来调用才会发生间接调用

从汇编角度分析g++编译器如何实现虚函数动态绑定

代码语言:javascript
复制

g++ -S -g  class_virtaul_fuc.cpp 
call    _ZN6ClassBC1Ev
call    *%rdx
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Offer多多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 故事
    • 从汇编看c++中临时对象的析构时机
    • 使用gdb探索 C++ 虚函数表
      • 虚函数的间接调用
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档