这是餐桌上一个必点菜,大家都知道,根本不是独家秘笈, 但是看了无数次文章和book,依然完全被锤,停留 表面上,完全不知道对方在想什么,
其实很简单,就这样呀。
感觉没问题就是最大的问题。
无论任何公司阿里,滴滴,还有腾讯,还是普通公司
都上这个菜,这就是一条线索,故事的线索。
别人都知道,我不知道 才是最尴尬的地方
C++通过指针实现了多态,运行时函数重载决议, 是他最有优秀地方,但是也是最让人痛苦地方, 内存模型假设存在 让对象生命周期管理更加复杂。异常总是在看不到地方出现。怎么办? 然后出现了智能指针,这能说拆东墙补西墙吗? 为了保证正确拷贝赋值, 虚指针和智能指针在类型转换 采取哪些措施保证唯一或者正确 , 这可能是隐藏的副本,boss任务。
我需要你必须重视起来,思想上重视就是口号,必须采取行动 必须阅读
看到别人是怎么用的,从这里开始,
简述C++虚函数作用及底层实现原理(牛客)
思考:复制操作和虚函数有关系吗?
问题1:什么复制拷贝
问题2:默认拷贝对虚函数做了什么
参考 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
不同对象,创建不同的虚指针吗?创建不同的虚函数表吗?,
一个类可以创建多个对象 在创建对象时,编译系统只为对象中的成员数据(成员变量)分配内存空间 而同类对象的成员函数的代码却是共享的。
内部的成员函数:普通函数:不占用内存。虚函数:要占用4个字节,用来指定虚函数的虚拟函数表的入口地址。所以一个类的虚函数所占用的地址是不变的.
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++编译器如何实现虚函数动态绑定
g++ -S -g class_virtaul_fuc.cpp
call _ZN6ClassBC1Ev
call *%rdx