多重继承内存地址问题

  1. #include <iostream.h>  
  2. class ClassA  
  3. {  
  4. public:  
  5. virtual ~ ClassA(){};  
  6. virtual void FunctionA(){};  
  7. };  
  8. class ClassB  
  9. {  
  10. public:  
  11. virtual void FunctionB(){};  
  12. };  
  13. class ClassC : public ClassA,public ClassB  
  14. {public:  
  15. };  
  16. void main(){  
  17. ClassC aObject;  
  18. ClassA* pA=&aObject;  
  19. ClassB* pB=&aObject;  
  20. ClassC* pC=&aObject;  
  21. cout<<pA<<endl;  
  22. cout<<pB<<endl;  
  23. cout<<pC<<endl;  
  24. }  

假设aObject的地址是 xxx.
那么:
pA=xxx
pB=xxx + 4(如果ClassA里面多一个 int a;那么这个地址将会变成xxx+8)
pC=xxx

ClassA里面定义了虚函数,所以会有一个虚函数表指针(4 byte)。ClassA的总大小为4 byte. 同理,ClassB的总大小为4 byte.
ClassC从ClassA, ClassB继承来的,在内存中ClassA, ClassB顺序排列。ClassC的总大小为8 byte.

“ClassB* pB=&aObject;”这个隐式转换会得到ClassB类的地址。
class CA{
public:
	//virtual ~CA(){};
	//virtual void f(){cout<<"CA::f"<<endl;}
	int m1;
};
class CB{
public:
	int m2;
	//virtual void f(){cout<<"CA::f"<<endl;}
};
class CC: public CA,public CB{
public:
	int m3;
};
int main(){
	CC* pC=new CC;
	CB* pB=dynamic_cast<CB*>(pC);
	CA* pA=dynamic_cast<CA*>(pC);
	if(pC==pB)
		cout<<"equal"<<endl;
	else
		cout<<"not equal"<<endl;
	if(pC==pA)
		cout<<"equal"<<endl;
	else
		cout<<"not equal"<<endl;
	if(int(pC)==int(pB))
		cout<<"equal"<<endl;
	else
		cout<<"not equal"<<endl;
	if(int(pC)==int(pA))
		cout<<"equal"<<endl;
	else
		cout<<"not equal"<<endl;
	system("pause");
	return 1;
}
输出是:equal  equal  not equal  equal

猜你喜欢

转载自1527zhaobin.iteye.com/blog/1612304