3.4 C++四种继承关系中内存分布

原创 2016年08月31日 16:55:51

1、单一继承不含虚函数

在这种情况下,对象会保持基类的原样性,并且一个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)):0
4、虚拟继承

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++继承关系中的动态内存分配

假设基类使用动态内存分配,并重新定义了赋值和复制构造函数 class class_a { private: char* a; int rating; public: cl...

Hibernate 的四种继承关系

一、继承关系_整个继承树映射到一张表 对象模型(Java类结构) 一个类继承体系一张表(subclass)(表结构) Employee.java Java代码   ...

c++类继承关系

  • 2012年10月23日 16:57
  • 205KB
  • 下载

Java继承关系、构造器的内存分析

由于ZangXT对这个问题提出了质疑, 所以, 在文末, 又追加了一个测试使用super绕过多态的例子, 以期证明, 构造一个对象的时候, 隐含的持有了父类的引用(或者以更合适的名词称呼: 向上代理)...

Effective c++(笔记)之继承关系与面向对象设计

Effective c++ 之 继承关系与面向对象设计 提到了在一堆classes中去辨别关系的准则,面向对象设计中容易产生的问题...

【c++基础】关于继承关系中构造函数的粗略理解

项目中要创建不同用途的NPC,要提前给他们写一个基类,只要会走路

C++中继承关系简介

继承 单继承 class SubClass:[继承方式]ParentClass { //variables }; 子类成员对基类成员的访问方式:继承方式 子类成员对基类成员的访问方式的限制...

C++中的继承关系

C++中的继承关系 一、继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,称派生类。继...

详谈C++虚函数表那回事(多重继承关系)

C++多重继承关系中虚函数表相关
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:3.4 C++四种继承关系中内存分布
举报原因:
原因补充:

(最多只允许输入30个字)