class A
{
};
class B
{
public:
virtual void vfunc1();
}
sizeof(A) = 1 // 空类1个字节用于地址定位
sizeof(B) = 4
class A
{
public:
virtual void vfunc1() = 0;
virtual void vfunc2() = 0;
virtual void vfunc1(int x) = 0;
virtual void vfunc3() = 0;
virtual void vfunc1(int x, int y) = 0;
};
class B : public A
{
public:
virtual void vfunc1(int x) = 0;
virtual void vfunc4() = 0;
virtual void vfunc2(int x) = 0
}
请问B的虚表是应该是什么样的?
void A::vfunc1();
由于 vfunc1 有两个重载,按照第 2 条规则,依次提前重载函数
void A::vfunc1();
void A::vfunc1(int x);
void A::vfunc1(int x, int y);
void A::vfunc1();
void A::vfunc1(int x);
void A::vfunc1(int x, int y);
void A::vfunc2();
void A::vfunc3();
B 重写了 A 的 void vfunc1(int x) 函数,所以将表中对应的函数替换void A::vfunc1();
void B::vfunc1(int x);
void A::vfunc1(int x, int y);
void A::vfunc2();
void A::vfunc3();
B::vfunc4() 到虚表中void A::vfunc1();
void B::vfunc1(int x);
void A::vfunc1(int x, int y);
void A::vfunc2();
void A::vfunc3();
void B::vfunc4();
B::vfunc2(int x) 没有重写A中的函数,按照规则 1 添加到虚表中void A::vfunc1();
void B::vfunc1(int x);
void A::vfunc1(int x, int y);
void A::vfunc2();
void A::vfunc3();
void B::vfunc4();
void B::vfunc2(int x);
答:ABI兼容
我们输出SDK时一般会这么写
awesome.hclass IAwesomeSDK
{
public:
virtual void foo() = 0;
virtual void bar(int x) = 0;
};
extern "C" {
// 创建SDK实例
IAwesomeSDK *createAwesomeInstance();
// 销毁SDK实例
void destroyAwesomeInstance();
} // extern "C"
别人使用时一般这么写
demo.cppint main(int argc, char **argv)
{
IAwesomeSDK *sdk = createAwesomeInstance();
sdk->foo();
sdk->bar();
destroyAwesomeInstance();
return 0;
}