class IFace1 {
public:
virtual void fcn(int abc) = 0;
};
class IFace2 {
public:
virtual void fcn1(int abc) = 0;
};
class RealClass: public IFace1, public IFace2 {
public:
void fcn(int a) {
}
void fcn1(int a) {
}
};
我发现RealClass的虚函数表和对象内存布局如下。
Vtable for RealClass
RealClass::_ZTV9RealClass: 7u entries
0 (int (*)(...))0
8 (int (*)(...))(& _ZTI9RealClass)
16 (int (*)(...))RealClass::fcn
24 (int (*)(...))RealClass::fcn1
32 (int (*)(...))-8
40 (int (*)(...))(& _ZTI9RealClass)
48 (int (*)(...))RealClass::_ZThn8_N9RealClass4fcn1Ei
Class RealClass
size=16 align=8
base size=16 base align=8
RealClass (0x2af836d010e0) 0
vptr=((& RealClass::_ZTV9RealClass) + 16u)
IFace1 (0x2af836cfa5a0) 0 nearly-empty
primary-for RealClass (0x2af836d010e0)
IFace2 (0x2af836cfa600) 8 nearly-empty
vptr=((& RealClass::_ZTV9RealClass) + 48u)
我对这个很困惑。RealClass::_ZThn8_N9RealClass4fcn1Ei是什么?为什么IFace2的vptr指向它?当我从IFace2*调用fcn1时会发生什么?程序如何在RealClass的Vtable中找到fcn1?我猜它需要使用IFace2的vptr,但不清楚具体是如何实现的。
RealClass::non-virtual thunk to RealClass::fcn1(int)
,可能旨在进行内联和其他调用优化。提示:c++filt
程序是您的好朋友。 - user3159253