`
蒙面考拉
  • 浏览: 160586 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

多重继承内存地址问题

 
阅读更多

 

  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

 

 

分享到:
评论

相关推荐

    VC8.0上多重继承的内存布局

    在探讨“VC8.0上多重继承的内存布局”这一主题时,我们深入研究了C++语言中多重继承机制下的对象内存布局与虚函数表(virtual table)的组织方式,这是理解并有效利用C++多态性的关键。下面将详细阐述多重继承下对象的...

    C++编程思想--多重继承

    在设计时,可能需要修复因多重继承导致的接口问题,比如不兼容的函数签名或冲突的成员。这可能需要使用访问修饰符(public, protected, private)和重载、覆盖或隐藏基类成员来调整接口,以确保正确的行为和一致性...

    多重继承(6_7钻石继承问题)_C++_

    然而,多重继承也带来了一些复杂性和潜在的问题,其中最著名的就是所谓的“钻石继承”问题。在本篇中,我们将深入探讨多重继承以及如何解决钻石继承问题。 首先,让我们理解多重继承的基本概念。假设我们有三个类A...

    C++类继承内存布局详解图(一目了然)

    "C++类继承内存布局详解图" C++类继承内存布局是一种复杂的机制,涉及到类的继承、成员变量的访问、成员函数的访问、虚函数调用、强制转换到基类或虚基类等多个方面。在本文中,我们将从C结构的布局开始,逐步介绍...

    多重继承和虚继承.doc

    多重继承和虚继承是C++中两种高级的继承方式,它们允许类从多个基类中获取属性和行为,但同时也引入了一些复杂性和潜在的问题。 **多重继承** 是指一个类可以从多个基类派生,从而获得多个基类的特性。在多重继承中...

    实现C++类的多重继承

    综上所述,C++的多重继承是一种强大的工具,它使类可以继承多个基类的特性,但同时也带来了潜在的复杂性和问题。在实际编程中,开发者需要权衡利弊,合理利用这一特性。通过学习和实践,可以更好地理解和掌握多重...

    c++继承中的内存布局

    在C++中,类的内存布局受到多个因素的影响,包括成员变量的类型、成员函数的存在与否、继承类型(如单继承、多重继承或虚继承)等。下面分别探讨不同情况下的类布局。 ##### C结构(struct) 在C中,结构体的成员...

    vs2008 多重继承虚基类的简单应用

    在基类前加上关键字`virtual`,如`class Derived : virtual public Base1, virtual public Base2 {}`,这样所有通过多重继承路径到达的虚基类实例都将共享同一份内存,从而消除二义性。 在实际工作中,信息屏蔽...

    C++多重继承

    多重继承虽然提供了强大的功能,但也带来了复杂性和潜在问题,比如菱形问题。因此,在设计类层次结构时,需要谨慎考虑是否真的需要多重继承。在理解了这些基本概念和潜在问题后,你可以更有效地利用C++的多重继承...

    C++虚拟多重继承对象模型讨论-样例

    在实际编程中,虚拟多重继承可以增加代码的灵活性,但也会带来额外的开销,包括内存消耗(由于虚基类表的存在)和运行时性能影响(由于虚函数调用和虚基类的处理)。因此,虽然C++支持虚拟多重继承,但在设计类层次...

    c++继承中的内存布局 - 开源中国社区.pdf

    本文将围绕《C++继承中的内存布局》这一主题展开,探讨C++中不同类型的继承(如单继承、多重继承和虚继承)在内存布局方面的差异,并分析成员变量和成员函数的访问方式及实现细节。 #### 二、C结构(Struct)的内存...

    详解java为什么不允许类多重继承却允许接口多重继承

    类的多重继承会引发所谓的“钻石问题”,例如在上述代码的例子中,如果`a1`和`a2`都继承自`a`,并且各自提供了`b()`方法的实现,而`a12`同时继承了`a1`和`a2`,那么`a12`应该使用哪个`b()`方法呢?这将导致不确定性...

    C++- 抽象类(存虚函数)、接口、多重继承1

    总之,C++中的抽象类、接口和多重继承提供了丰富的设计选择,但同时也需要开发者谨慎处理可能出现的问题,如内存布局、菱形问题和冗余数据。在实际应用中,合理使用这些特性可以提高代码的可扩展性和可维护性。

    多重继承及虚继承中对象内存的分布

    本文我们将阐释GCC编译器针对多重继承和虚拟继承下的对象内存布局。尽管在理想的使用环境中,一个C++程序员并不需要了解这些编译器内部实现细节,实际上,编译器针对多重继承(特别是虚拟继承)的各种实现细节对于我们...

    C++类继承内存布局文档打包

    - 多重继承(一个子类继承多个基类)会引入更复杂的内存布局,可能导致数据成员的重复(如果基类之间有共同的祖先)和菱形问题( Diamond Problem),C++通过虚继承来解决这个问题,使得每个子类只有一个公共基类的...

    多重继承下的虚函数表[归纳].pdf

    总结来说,多重继承下的虚函数表是C++实现多态性的重要手段,它确保了通过基类指针调用虚函数时能够调用到正确版本的函数。每个类根据其继承关系拥有一个或多个虚函数表,这些表存储了虚函数的地址,使得多态调用...

Global site tag (gtag.js) - Google Analytics