继承(五)

1.类/对象大小计算

    (1)结构体对齐原则

    (2)与数据成员有关,与成员函数无关

    (3)与静态数据成员无关

    (4)虚继承对类的大小的影响

    (5)虚函数对类的大小的影响

2.虚基类表

     (1)virtual base table

               [1]本类地址与虚基类表指针地址的差

               [2]虚基类地址与虚基类表指针地址的差

     (2)virtual base table pointer(vbptr)

              



#include <iostream>

using namespace std;

class BB {
public:
	int bb_;
};

class B1 : virtual public BB {
public:
	int b1_;
};

class B2 : virtual public BB {
public:
	int b2_;
};

class DD : public B1, public B2 {
public:
	int dd_;
};

int main() {
	
	cout << "BB= " << sizeof(BB) << endl;
	cout << "B1= " << sizeof(B1) << endl;
	cout << "DD= " << sizeof(DD) << endl;
	
	B1 b1;
	long** p;
	
	cout << "&b1= " << &b1 << endl;
	cout << "&b1.bb_= " << &b1.bb_ << endl;
	cout << "&b1.b1_= " << &b1.b1_ << endl;
	
	p = (long**)&b1;
	cout << p[0][0] << endl;
	cout << p[0][1] << endl;

	DD dd;
	cout << "&dd= " << &dd << endl;
	cout << "&dd.bb_= " << &dd.bb_ << endl;
	cout << "&dd.b1_= " << &dd.b1_ << endl;
	cout << "&dd.b2_= " << &dd.b2_ << endl;
	
	p = (long**)ⅆ
	
	cout << p[0][0] << endl;
	cout << p[0][1] << endl;

	cout << p[2][0] << endl;
	cout << p[2][1] << endl;
	cout << sizeof(long*) << endl;
	cout << sizeof(long) << endl;

	BB* pp;
	
	pp = ⅆ
	cout << pp->bb_ << endl;  // 通过间接访问,这需要运行时的支持

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值