class A
{
public:
int a;
};
class B : virtual public A
{
public:
int b;
};
class C : virtual public A
{};
class D : public C, public B
{};
int _tmain(int argc, _TCHAR* argv[])
{
A x;
B y; // ----->这里为B时候内存是 下面1的情况
//D y; // ----->这里为D的时候y的内存如下2;
int a = 0, b = 0, c = 0;
y.b = 3;
y.a = 4;
int *y1 = (int*)(&y);
memcpy(&a, y1, 4);
memcpy(&b, y1 + 1, 4);
memcpy(&c, y1 + 2, 4);
cout << a << " " << b << " " << c <<" " << endl;
//system("pause"); //在此处加上断点
return 0;
}
1.
&y 0x0012fec0
&(y.b) 0x0012fec4
&(*(A*)(&y)) 0x0012fec8
&(*(A*)(&(y.a)) 0x0012fec8
2.
&y 0x0012febc
&(*(C*)(&y)) 0x0012febc
&(*(B*)(&y)) 0x0012fec0
&(y.b) 0x0012fec4
&(*(A*)(&(y.a)) 0x0012fec8
class A
{
public:
int a;
};
class B : virtual public A
{
public:
int b;
};
class C : virtual public A
{
public:
//int c; // 打开 3
};
class D : public C, public B
{
public:
//int d; // 打开 4
};
int _tmain(int argc, _TCHAR* argv[])
{
A x;
D y;
int a = 0, b = 0, c = 0;
y.b = 3;
y.a = 4;
int *y1 = (int*)(&y);
memcpy(&a, y1, 4);
memcpy(&b, y1 + 1, 4);
memcpy(&c, y1 + 2, 4);
cout << a << " " << b << " " << c <<" " << endl;
//system("pause"); //在此处加上断点
return 0;
}
3.
&(y.c) 0x0012febc
&y 0x0012feb8
&(*(C*)(&y)) 0x0012feb8
&(*(B*)(&y)) 0x0012fec0
&(y.b) 0x0012fec4
&(*(A*)(&(y.a)) 0x0012fec8
4.
&(y.d) 0x0012feb8
&y 0x0012feb4
&(*(C*)(&y)) 0x0012feb4
&(*(B*)(&y)) 0x0012febc
&(y.b) 0x0012fec0
&(y.c) 0x0012fec4
&(*(A*)(&(y.a)) 0x0012fec8
分享到:
相关推荐
在C++中,对象的内存布局受到多种因素的影响,例如成员变量的类型、是否有虚函数等。接下来我们将详细探讨不同情况下的对象内存布局。 ##### 1. **空类** 空类是指没有任何成员变量的类。尽管此类没有任何成员,但...
在C++对象的内存布局中,编译器会自动将对象头和虚函数表嵌入到对象体中,以便于快速地访问对象的成员变量和虚函数。在这种方式下,对象头和虚函数表的内存布局是固定的,而对象体的内存布局则取决于对象的成员变量...
C++对象的内存布局是一个复杂且重要的主题,涉及到类的成员变量、继承关系、虚函数表以及编译器的实现细节。本文将深入探讨几种特定情况下的C++对象内存布局,包括单一继承、虚拟继承、多重继承、重复继承和钻石型...
在探讨“VC8.0上多重继承的内存布局”这一主题时,我们深入研究了C++语言中多重继承机制下的对象内存布局与虚函数表(virtual table)的组织方式,这是理解并有效利用C++多态性的关键。下面将详细阐述多重继承下对象的...
### C++继承中的内存布局详解 #### 深入探讨C++对象模型 在C++编程语言中,理解和掌握类的内存布局对于优化程序性能、避免潜在的内存问题至关重要。尤其是在涉及类继承的情况下,深入了解内存如何组织可以帮助...
### C++对象内存布局 #### 1. 最简单的类 在C++中,理解对象的内存布局对于...通过以上分析,我们不仅了解了C++对象的基本内存布局,还深入了解了虚函数调用机制背后的细节。这对于理解和优化C++程序性能非常重要。
每个对象在其内存布局中会包含一个虚指针,这个指针在对象创建时被初始化为指向相应的虚函数表。 虚函数调用的过程如下: 1. 当通过基类指针调用虚函数时,编译器会在生成的机器代码中插入一条指令,获取对象的虚...
《C++继承中的内存布局借鉴》探讨了C++对象模型,特别是从内存布局的角度解析了类的构造、成员变量和函数的访问、继承方式(包括单继承、多重继承和虚继承)以及各种语言特性的实现。这篇译文是理解C++对象模型的一...
继承作为面向对象编程的一种基本特征,其使用频率... 假设derived 虚继承自base类,那么derivd与base是一种“has a”的关系,即derived类有一个指向base类的vptr。(貌似有些牵强!某些编译器确实如此) 因此虚
总结起来,C++中的多态内存布局涉及到虚函数表和虚函数指针,它们使得在运行时能够根据对象的实际类型动态绑定函数调用。理解和掌握这一概念对于编写高效且灵活的多态代码至关重要。在实际编程中,使用虚函数可以...
本篇将深入探讨这个问题以及C++如何通过虚继承来解决这一难题。 菱形结构问题源自于一个类(孙子类)继承自两个不同的父类,而这两个父类又共同继承自同一个祖父类。在没有特殊处理的情况下,孙子类会有两份祖父类...
在C++编程中,对象的内存布局是一个关键概念,它涉及到如何在内存中存储类的实例,包括成员变量和虚函数表等元素。本文将详细分析C++对象内存布局的各种情况,涵盖单一继承、虚拟继承、多重继承、重复继承以及钻石型...
虚继承是一种C++中的继承方式,它允许一个基类被多个派生类共享,从而避免了多继承导致的“菱形问题”(即一个对象有多重同级的基类,而这些基类又共享了一个共同的基类)。虚继承的主要目的是解决基类的多重实例化...
在C++编程中,对象内存布局是一个非常关键的概念,它涉及到如何在内存中存储对象以及如何进行指针转换。在不同的编译器和平台上,内存布局可能会有所不同,但有一些通用的原则和约定。本文主要探讨了VC++ .NET 2003 ...
C++学习笔记:关于C++类与动态内存分配中布局new操作符 在C++中,new操作符是一种动态内存分配方式,用于在堆上分配内存以存储对象。但是,在某些情况下,我们需要使用布局new操作符来分配内存,例如在现有的内存块...
为了解决多继承中的菱形问题,C++引入了虚继承(Virtual Inheritance)。虚继承使得基类的指针或引用能够正确地指向派生类的对象,即使这个派生类是从多个具有共同基类的类中派生出来的。在声明基类时,使用关键字`...
在C++编程中,对象的内存布局是一个关键概念,它涉及到类的成员变量、虚函数、继承等多个方面。本文将探讨这些因素如何影响C++对象在内存中的组织方式,特别关注单一继承、虚拟继承、多重继承、重复多重继承以及钻石...
C++菱形继承和虚继承的问题总结 C++是一种高效、灵活的编程语言,它提供了封装、继承和多态等三大特性。继承是C++中的一种重要机制,它允许一个类继承另一个类的成员和方法,使得程序设计更加灵活和高效。但是在...
在C++编程的世界里,类的对象内存布局是一个高级且复杂的议题。当涉及到继承、多态以及虚函数的使用时,这个问题就变得更加引人入胜。理解这些概念不仅可以帮助我们写出更加高效和规范的代码,而且在调试和性能优化...