3.4 C++四种继承关系中内存分布
2016-08-31 16:55
537 查看
1、单一继承不含虚函数
在这种情况下,对象会保持基类的原样性,并且一个class derived class object表现出来的东西,是其自己的members加上其base classes members的总和。
2、单一继承含虚函数
与单一继承不含虚函数唯一不同的是,在含有虚函数时,vptr放置的位置。如果vptr放置在起始位置处,则会表现出非自然多态。如果在在尾处,则可以自然多态。下面是一个构造的具有虚函数的继承类。
对于上述类,其模型如下:
、
3、多重继承
多重继承的问题主要发生于derived class objects和其第二或后继的base class之间的转换。他的内存分布其实各个部分相加再加上自己的部分。
在这个模型中,类型转换是如何发生的呢?
Class如果内含一个或多个virtual base class subobjects,将被分割成两部分:一个不变区域和一个共享区域。共享区域指的是virtual base class subobject这一部分,其位置会因为每次的派生操作而有变化。
下面我将分析一组虚拟派生继承,以及它在vs中的内存分布。代码如下:class Point
{
char p;
};
class Point2d : public virtual Point
{
int a;
int aa;
char aaa;
};
class Point3d : public virtual Point2d
{
int b;
public:
virtual void print()
{
std::cout << "this is the Point3d" << std::endl;
}
};
class Vertex : public virtual Point2d
{
int c;
public:
virtual void print()
{
std::cout << "this is the Vertex" << std::endl;
}
};
class Vertex3d : public Point3d, public Vertex
{
int d;
};
在这段代码中,其所构造的模型如下:
这是我根据在vs2015中根据类大小进行判断的,这个模型最大的坏处是:随着虚拟继承链的加长,导致间接存取层次的增加。
在这种情况下,对象会保持基类的原样性,并且一个class derived class object表现出来的东西,是其自己的members加上其base classes members的总和。
class Point2d { int a; char b; }; class Point3d : public Point2d { char c; };对于上述类,其模型如下:
2、单一继承含虚函数
与单一继承不含虚函数唯一不同的是,在含有虚函数时,vptr放置的位置。如果vptr放置在起始位置处,则会表现出非自然多态。如果在在尾处,则可以自然多态。下面是一个构造的具有虚函数的继承类。
class Point2d { int a; char b; }; class Point3d : public Point2d { char c; public: virtual void print() { std::cout << "this is the Point2d" << std::endl; } }; class Point4d : public Point3d { char d; public: void print() override { std::cout << "this is the Point4d" << std::endl; } };
对于上述类,其模型如下:
、
3、多重继承
多重继承的问题主要发生于derived class objects和其第二或后继的base class之间的转换。他的内存分布其实各个部分相加再加上自己的部分。
class Point3d { private: int _x, _y,_z; public: virtual void print() { std::cout << "this is the point3d" << std::endl; } }; class Vertex { private: char v; public: virtual void print() { std::cout << "this is the vertex" << std::endl; } }; class Vertex3d : public Point3d, public Vertex { int num; };对于这个类,它们的模型是:
在这个模型中,类型转换是如何发生的呢?
Point3d* ptrP3d1; Vertex* ptrVtx1; Vertex3d* ptrVtx3d1; Vertex3d vtx3d1; ptrP3d1 = &vtx3d1;//自然多态,不需要编译器参与 ptrVtx1 = &vtx3d1;//非自然多态,需要编译器参数 ptrVtx1 = (Vertex*)((char*)(&vtx3d1)+sizeof(Point3d)); ptrVtx3d1 = &vtx3d1; ptrVtx1 = ptrVtx3d1;//非自然多态,需要编译器 ptrVtx1 =ptrVtx3d1?(Vertex*)((char*)(ptrVtx3d1)+sizeof(Point3d)):04、虚拟继承
Class如果内含一个或多个virtual base class subobjects,将被分割成两部分:一个不变区域和一个共享区域。共享区域指的是virtual base class subobject这一部分,其位置会因为每次的派生操作而有变化。
下面我将分析一组虚拟派生继承,以及它在vs中的内存分布。代码如下:class Point
{
char p;
};
class Point2d : public virtual Point
{
int a;
int aa;
char aaa;
};
class Point3d : public virtual Point2d
{
int b;
public:
virtual void print()
{
std::cout << "this is the Point3d" << std::endl;
}
};
class Vertex : public virtual Point2d
{
int c;
public:
virtual void print()
{
std::cout << "this is the Vertex" << std::endl;
}
};
class Vertex3d : public Point3d, public Vertex
{
int d;
};
在这段代码中,其所构造的模型如下:
这是我根据在vs2015中根据类大小进行判断的,这个模型最大的坏处是:随着虚拟继承链的加长,导致间接存取层次的增加。
相关文章推荐
- 【c++】深入剖析虚拟继承与各种继承关系中派生类内成员内存分布情况及虚基类表的内容
- C++ 虚继承 虚函数 内存分布
- C++多重继承虚表的内存分布
- C++多态调用和继承内存分布
- C++继承关系中Data Member和Functions Member的内存布局(基于C++ Object Model描述)
- C++内存分布之菱形继承(无虚函数)
- C++虚拟继承中对象内存的分布
- C++中继承的内存分布
- c++虚函数实现机制以及类继承中的内存分布
- 【C++】虚函数和虚继承的内存分布情况
- C++对象内存分布(3) - 菱形继承(virtual)
- C++继承、多重继承与虚基类 继承、多重继承时对象内存分布
- C++浅析——继承类内存分布和虚析构函数
- C++虚拟继承中_对象内存的分布_虚继承会多余分配虚表v-tab的指针vptr_图1-1清楚的描述了虚继承类对象内存的分布_转载淘宝共享数据平台
- C++对象内存分布(3) - 菱形继承(virtual)
- 【c++内存分布系列】单继承
- C++虚拟继承__对象内存的分布_虚继承会多余分配虚表v-tab的指
- C++继承多态下的内存分布
- C++ 多重继承和虚继承 内存分布
- c/c++: c++继承 内存分布 虚表 虚指针 (转)