- #include <iostream.h>
- class ClassA
- {
- public:
- virtual ~ ClassA(){};
- virtual void FunctionA(){};
- };
- class ClassB
- {
- public:
- virtual void FunctionB(){};
- };
- class ClassC : public ClassA,public ClassB
- {public:
- };
- void main(){
- ClassC aObject;
- ClassA* pA=&aObject;
- ClassB* pB=&aObject;
- ClassC* pC=&aObject;
- cout<<pA<<endl;
- cout<<pB<<endl;
- cout<<pC<<endl;
- }
假设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
发表评论
-
析构函数为虚函数的原因
2012-09-09 11:42 832我们知道,用C++开发的时候,用来做基类的类的析构函数 ... -
hash的应用
2012-08-31 23:02 961第一部分为一道百度面试题Top K算法的详解;第二部分为关 ... -
微软智力题
2012-08-29 19:59 567第一组1.烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有 ... -
C++不能被继承的类
2012-08-27 20:16 1059一个类不能被继承, ... -
括号对齐问题
2012-08-27 10:47 1410解法一:左右括号成一对则抵消 可以 ... -
树的遍历
2012-08-19 10:43 719/****************************** ... -
堆排序
2012-08-16 14:24 883堆:(二叉)堆数据结构是一种数组对象。它可以被视为一棵完全 ... -
多态赋值
2012-08-14 16:16 832#include <iostream> usi ... -
static变量与static函数(转)
2012-08-13 10:15 746一、 static 变量 static变量大致分为三种用法 ... -
不用sizeof判断16位32位
2012-08-10 15:21 1704用C++写个程序,如何判断一个操作系统是16位还是3 ... -
找出连续最长的数字串(百度面试)
2012-08-09 15:15 1146int maxContinuNum(const char*in ... -
顺序栈和链栈
2012-08-06 10:01 799顺序栈:话不多说直接上代码 #include ... -
队列的数组实现和链表实现
2012-08-05 16:20 1025话不多少,数组实现上代码: #include<i ... -
KMP算法详解
2012-08-02 21:40 887KMP算法: 是在一个“主文本字符串” ... -
字符串的最长连续重复子串
2012-08-01 15:05 9777两种方法: 循环两次寻找最长的子串: <方法一> ... -
寻找一个字符串连续出现最多的子串的方法(转)
2012-07-31 21:19 986算法描述首先获得后缀数组,然后1.第一行第一个字符a,与第二行 ... -
字符串的循环移位
2012-07-31 16:52 975假设字符串:abcdefg 左循环两位:cdefgab 右 ... -
一次谷歌面试趣事(转)
2012-07-31 15:26 767很多年前我进入硅谷 ... -
约瑟夫环问题(循环链表)
2012-07-30 21:31 1290题目描述:n只猴子要选大王,选举方法如下:所有猴子按 1, ... -
面试之单链表
2012-07-30 20:18 7281、编程实现一个单链表的建立/测长/打印。 ...
相关推荐
在探讨“VC8.0上多重继承的内存布局”这一主题时,我们深入研究了C++语言中多重继承机制下的对象内存布局与虚函数表(virtual table)的组织方式,这是理解并有效利用C++多态性的关键。下面将详细阐述多重继承下对象的...
在设计时,可能需要修复因多重继承导致的接口问题,比如不兼容的函数签名或冲突的成员。这可能需要使用访问修饰符(public, protected, private)和重载、覆盖或隐藏基类成员来调整接口,以确保正确的行为和一致性...
然而,多重继承也带来了一些复杂性和潜在的问题,其中最著名的就是所谓的“钻石继承”问题。在本篇中,我们将深入探讨多重继承以及如何解决钻石继承问题。 首先,让我们理解多重继承的基本概念。假设我们有三个类A...
"C++类继承内存布局详解图" C++类继承内存布局是一种复杂的机制,涉及到类的继承、成员变量的访问、成员函数的访问、虚函数调用、强制转换到基类或虚基类等多个方面。在本文中,我们将从C结构的布局开始,逐步介绍...
多重继承和虚继承是C++中两种高级的继承方式,它们允许类从多个基类中获取属性和行为,但同时也引入了一些复杂性和潜在的问题。 **多重继承** 是指一个类可以从多个基类派生,从而获得多个基类的特性。在多重继承中...
综上所述,C++的多重继承是一种强大的工具,它使类可以继承多个基类的特性,但同时也带来了潜在的复杂性和问题。在实际编程中,开发者需要权衡利弊,合理利用这一特性。通过学习和实践,可以更好地理解和掌握多重...
在C++中,类的内存布局受到多个因素的影响,包括成员变量的类型、成员函数的存在与否、继承类型(如单继承、多重继承或虚继承)等。下面分别探讨不同情况下的类布局。 ##### C结构(struct) 在C中,结构体的成员...
在基类前加上关键字`virtual`,如`class Derived : virtual public Base1, virtual public Base2 {}`,这样所有通过多重继承路径到达的虚基类实例都将共享同一份内存,从而消除二义性。 在实际工作中,信息屏蔽...
多重继承虽然提供了强大的功能,但也带来了复杂性和潜在问题,比如菱形问题。因此,在设计类层次结构时,需要谨慎考虑是否真的需要多重继承。在理解了这些基本概念和潜在问题后,你可以更有效地利用C++的多重继承...
在实际编程中,虚拟多重继承可以增加代码的灵活性,但也会带来额外的开销,包括内存消耗(由于虚基类表的存在)和运行时性能影响(由于虚函数调用和虚基类的处理)。因此,虽然C++支持虚拟多重继承,但在设计类层次...
本文将围绕《C++继承中的内存布局》这一主题展开,探讨C++中不同类型的继承(如单继承、多重继承和虚继承)在内存布局方面的差异,并分析成员变量和成员函数的访问方式及实现细节。 #### 二、C结构(Struct)的内存...
类的多重继承会引发所谓的“钻石问题”,例如在上述代码的例子中,如果`a1`和`a2`都继承自`a`,并且各自提供了`b()`方法的实现,而`a12`同时继承了`a1`和`a2`,那么`a12`应该使用哪个`b()`方法呢?这将导致不确定性...
总之,C++中的抽象类、接口和多重继承提供了丰富的设计选择,但同时也需要开发者谨慎处理可能出现的问题,如内存布局、菱形问题和冗余数据。在实际应用中,合理使用这些特性可以提高代码的可扩展性和可维护性。
本文我们将阐释GCC编译器针对多重继承和虚拟继承下的对象内存布局。尽管在理想的使用环境中,一个C++程序员并不需要了解这些编译器内部实现细节,实际上,编译器针对多重继承(特别是虚拟继承)的各种实现细节对于我们...
- 多重继承(一个子类继承多个基类)会引入更复杂的内存布局,可能导致数据成员的重复(如果基类之间有共同的祖先)和菱形问题( Diamond Problem),C++通过虚继承来解决这个问题,使得每个子类只有一个公共基类的...
总结来说,多重继承下的虚函数表是C++实现多态性的重要手段,它确保了通过基类指针调用虚函数时能够调用到正确版本的函数。每个类根据其继承关系拥有一个或多个虚函数表,这些表存储了虚函数的地址,使得多态调用...