虚函数相关代码及结果

情况1:

class A {	
public:
	int A_1;
	int A_2;
//	virtual void aa() {};
};

class B :public virtual A{	
public:
	int B_1;
	int B_2;
	int B_3;
	//virtual void aa() {};
	//virtual void bb() {};
};
class C :public virtual B {
	char i[3];
public:
	virtual void cc() {};
};

 结果:(32位)8、24、36

情况二:

#include "stdafx.h"
#include<vector>
#include<iostream>
using namespace std;

class A {
public:
	int A_1;
	int A_2;
	virtual void aa() {};
};

class B :public  A{
public:
	int B_1;
	int B_2;
//	virtual void aa() {};
	virtual void bb() {};
};
class C :public virtual B {
	char i[3];
public:
	virtual void cc() {};
};
int main(int argc,char *argv[])
{
	B b;
	cout << "sizeof(A)=" << sizeof(A) << endl;
	cout << "sizeof(b)=" << sizeof(B) << endl;
	cout << "sizeof(C)=" << sizeof(C) << endl;
	return 0;
}

结果: (32位)12、20、32

情况三:

class A {
public:
	int A_1;
	int A_2;
	virtual void aa() {};
};

class B :public  A{
public:
	int B_1;
	int B_2;
	int B_3;
//	virtual void aa() {};
	virtual void bb() {};
};
class C :public virtual B {
	char i[3];
public:
	virtual void cc() {};
};
int main(int argc,char *argv[])
{
	B b;
	cout << "sizeof(A)=" << sizeof(A) << endl;
	cout << "sizeof(b)=" << sizeof(B) << endl;
	cout << "sizeof(C)=" << sizeof(C) << endl;
	return 0;
}

 结果:(32位)12、24、36

情况四:存在多态的情况下

class A {
public:
	int A_1;
	int A_2;
	virtual void aa() {};
};

class B :public  A{
public:
	int B_1;
	int B_2;
	int B_3;
	virtual void aa() {};
	virtual void bb() {};
};
class C :public virtual B {
	char i[3];
public:
	virtual void cc() {};
};

 结果:(64位编译器)16、32、56     (32位编译器)12、24、36

情况五:虚继承: 

虚继承的时候子类会有一个指向自己虚函数表的指针,同时也会加入一个指向父类的虚类指针,然后还要包含父类的所有内容。

虚继承时如果子类父类都有虚函数,那么它会重新建立一张虚表,不包含父类虚表的内容;而在普通的继承中却是在父类虚表的基础上建立一张虚表。这就意味着如果虚继承中子类父类都有各自的虚函数,在子类里面就会有两个虚函数表指针,一个指向父类的虚表,一个指向子类的虚表,而普通的继承只有一个指向子类虚表的指针

class A {
public:
	int A_1;
	int A_2;
	virtual void aa() {};
};

class B :public virtual A{
public:
	int B_1;
	int B_2;
	int B_3;
	//virtual void aa() {};
	virtual void bb() {};
};
class C :public virtual B {
	char i[3];
public:
	virtual void cc() {};
};

int main(int argc,char *argv[])
{
	A a;
	B b;
	C c;
	cout << "sizeof(A)=" << sizeof(A) << endl;
	cout << "sizeof(b)=" << sizeof(b) << endl;
	cout << "sizeof(C)=" << sizeof(C) << endl;
	return 0;
}

结果:(64位编译器)16、48、72,(32编译器)12、32、44

此时内存分布如下

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值