面试宝典之C++虚函数虚继承Word文档格式.docx
《面试宝典之C++虚函数虚继承Word文档格式.docx》由会员分享,可在线阅读,更多相关《面试宝典之C++虚函数虚继承Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
![面试宝典之C++虚函数虚继承Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/22/2364cdf6-85f7-4570-9f48-40ac6f216061/2364cdf6-85f7-4570-9f48-40ac6f2160611.gif)
}
};
1>
classAsize(12):
+---
0|m_pbl
4|m_prt
8|m_prv
1.1单个类
1.1.1单个虚函数
voidvirtualf1()
{
sf1."
2>
classAsize(16):
0|{vfptr}//虚表指针
4|m_pbl
8|m_prt
12|m_prv
+---
A:
:
$vftable@:
//虚表
|&
A_meta
|0
0|&
A:
f1
f1thisadjustor:
0
1.1.2多个虚函数
voidvirtualf2()
sf2."
0|{vfptr}
//同一张表中
|0
1|&
f2
f2thisadjustor:
1.2继承
1.2.1不加函数
classB:
publicA
classBsize(16):
+---
|+---(baseclassA)
0||{vfptr}//同一个指针
4||m_pbl
8||m_prt
12||m_prv
|+---
B:
//B的虚表
|&
B_meta
|0
1.2.2子类override父类的函数
voidf1()
sf1inB."
|+---(baseclassA)
0||{vfptr}
|+---
B_meta//B用来标识类
B:
f1//变成了B的版本
1.2.3子类添加虚函数
voidvirtualf3()
sf3."
0||{vfptr}//合成一个表
2|&
f3//添加到虚表的尾部,类标识为B
f3thisadjustor:
1.2.4多继承
intm_data;
classB
classC:
publicA,publicB
classCsize(12):
0||{vfptr}
4||m_data
|+---(baseclassB)
8||{vfptr}//多个指针
C:
$vftable@A@:
C_meta
$vftable@B@:
|-8
1.3纯虚函数
1.3.1只在父类
voidvirtualf1()=0;
classAsize(8):
4|m_data
子类实现
classBsize(8):
1.3.2父类子类都有
voidvirtualf3()=0;
f3
纯虚函数在内存中布局和一般的虚函数一样。
2.虚继承
2.1虚继承
virtualpublicA
0|{vbptr}//指针
+---(virtualbaseA)
$vbtable@:
//虚继承表
0|0
1|4(Bd(B+0)A)
vbi:
classoffseto.vbptro.vbtefVtorDisp
A4040
2.2两个父类继承自同一个祖父类
2.2.1没有用虚继承
classD:
publicB,publicC
classDsize(8):
||+---(baseclassA)
0|||m_data
||+---
|+---(baseclassC)
4|||m_data//两个m_data
2.2.2加上虚继承之后
classDsize(12):
0||{vbptr}
4||{vbptr}//添加了两个虚继承的指针
+---(virtualbaseA)
8|m_data//只有了一个m_data
D:
$vbtable@B@:
1|8(Dd(B+0)A)
$vbtable@C@:
1|4(Dd(C+0)A)
classoffseto.vbptro.vbtefVtorDisp
A8040
3.虚函数和虚继承结合
3.1一般结合
classBsize(12):
0|{vbptr}//虚继承的指针在前
4|{vfptr}//虚函数的指针在后
8|m_data
|-4
4
3.2子类中有虚函数
classBsize(16):
4|{vbptr}
8|{vfptr}//2个指针
12|m_data
0|-4
1|4(Bd(B+4)A)
A8440
这种情况比较特殊,与不是虚继承的类相比,子类单独添加了一个虚表的指针。
若B对f1重写了,则
sf1intB."
8|{vfptr}
|-8
f1//f1变成了B的版本
8
3.3继承的两个父类继承自同一个祖父类
classDsize(16):
4||{vbptr}//不同类的不同
8|{vfptr}//只有一个
3.4继承的两个父类继承自同一个祖父类并且都有虚函数
publicC,publicB
voidvirtualf4()
sf4."
classDsize(24):
|+---(baseclassC)//虚继承C
4||{vbptr}
|+---(baseclassB)//虚继承B
8||{vfptr}
12||{vbptr}
16|{vfptr}
20|m_data
$vftable@C@:
D_meta
C:
D:
f4//非虚继承则不添加虚表指针,虚函数加到第一个虚表中
1|12(Dd(C+4)A)
1|4(Dd(B+4)A)
|-16
f4thisadjustor:
A16440