1.虚函数测试代码:
Sub1:继承单个带虚函数的基类并且自己也定义一个虚函数;
Sub2:继承不同的带虚函数的基类;
SubSub1:继承Sub1;
class BaseNormal
{
public:
BaseNormal() :m_n(0x1) {};
~BaseNormal() {};
private:
int m_n;
};
class BaseA
{
public:
BaseA() :m_a(0xaa){};
~BaseA() {};
virtual void funcA() {};
private:
int m_a;
};
class BaseB
{
public:
BaseB() :m_b(0xbb) {};
~BaseB() {};
virtual void funcB() {};
private:
int m_b;
};
class Sub1 :public BaseA
{
public:
Sub1() :m_sub(0x11) {};
~Sub1() {};
virtual void funcA() {};
virtual void funcSub() { cout << "Sub1::funcSub()" << endl; };
private:
int m_sub;
};
class Sub2 :public BaseA, public BaseB
{
public:
Sub2() :m_sub(0x22) {};
~Sub2() {};
virtual void funcA() {};
virtual void funcB() {};
private:
int m_sub;
};
class SubSub1 :public Sub1
{
public:
SubSub1() :m_subSub(0x111) {};
~SubSub1() {};
virtual void funcA() {};
virtual void funcSub() { cout << "SubSub1::funcSub()" << endl; };
private:
int m_subSub;
};
void Func_VirtualFunc()
{
cout << "Func_VirtualFunc()" << endl;
BaseNormal baseN;
std::cout << &baseN << "; BaseNormal size:" << sizeof(baseN) << endl;
BaseA baseA;
std::cout << &baseA << "; BaseA size:" << sizeof(baseA) << endl;
BaseB baseB;
std::cout << &baseB << "; BaseB size:" << sizeof(baseB) << endl;
Sub1 sub1;
std::cout << &sub1 << "; Sub1 size:" << sizeof(sub1) << endl;
sub1.funcSub();
Sub2 sub2;
std::cout << &sub2 << "; Sub2 size:" << sizeof(sub2) << endl;
SubSub1 subSub;
std::cout << &subSub << "; SubSub1 size:" << sizeof(subSub) << endl;
subSub.funcSub();
}
2.运行结果及内存结构细节:
3.总结说明:
1.Sub1:继承了带有虚函数的基类,切自己也有新增了一个虚函数,但是只有一个虚函数表,自己新增的虚函数被添加到了基类的(这个说法不一定准确)虚函数表中。
2.Sub2:继承了两个有虚函数的基类,这时Sub2会有两个虚函数表,切分别属于两个基类。
3.关于数据size大小不是简单的基类叠加,是因为程序编译的是64位的,最小对齐单位是8字节,会有补充字节确保8字节对齐。