C++虚函数继承相关细节测试记录

 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字节对齐。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值