c++-C++中虚基类中关于内存计算的问题

问题描述

C++中虚基类中关于内存计算的问题

情况一:
class D{
public:
int a;
};
class A:virtual public D{

};
class B :virtual public D{

};
class C:public A,public B{
public:
int a1;
};
用sizeof(C)计算出等于16;
情况二:
class D{
public:
int a;
};
class A:public D{

};
class B :public D{

};
class C:public A,public B{
public:
int a1;
};
用sizeof(C)计算出等于12;
情况一本人理解不了哪位大神给分析分析吧

解决方案

frank_20080215说法就不对了。不是3个a的size

 #include <iostream>
using namespace std;
class D{
public:
int a;
int b;
};
class A:virtual public D{
};
class B :virtual public D{
};
class C:public A,public B{
public:
int a1;
};
int main()
{
    cout << sizeof(C);
}

结果是20。

class D{
public:
int a;
};
class A:public D{
};
class B :public D{
};
class C:public A,public B{
public:
int a1;
};
int main()
{
cout << sizeof(D)<< endl;
cout << sizeof(A)<< endl;
cout << sizeof(C)<< endl;
}

结果是4 4 12

  #include <iostream>
using namespace std;
class D{
public:
int a;
};
class A:virtual public D{
};
class B :virtual public D{
};
class C:public A,public B{
public:
int a1;
};
int main()
{
cout << sizeof(D)<< endl;
cout << sizeof(A)<< endl;
cout << sizeof(C)<< endl;
}

结果是4 8 16

所以看明白了么?后者是因为虚继承本身多耗费了4个字节,同时虚继承只保留了一份指向D的存储,所以是16个字节。

解决方案二:

virtual -- 关键字,继承了,是深拷贝。class C的size = 4 + 3*4 = 16
一个a1 的size + 3个a的size;
没有virtual,相同时,共享: class C 的size= 4 + 2*4 =12
一个a1 的size + 2个a的size;
因为class C继承 A,B,共享了一个a的size

时间: 2024-10-31 23:34:08

c++-C++中虚基类中关于内存计算的问题的相关文章

详谈C++中虚基类在派生类中的内存布局_C 语言

今天重温C++的知识,当看到虚基类这点的时候,那时候也没有太过追究,就是知道虚基类是消除了类继承之间的二义性问题而已,可是很是好奇,它是怎么消除的,内存布局是怎么分配的呢?于是就深入研究了一下,具体的原理如下所示: 在C++中,obj是一个类的对象,p是指向obj的指针,该类里面有个数据成员mem,请问obj.mem和p->mem在实现和效率上有什么不同. 答案是:只有一种情况下才有重大差异,该情况必须满足以下3个条件: (1).obj 是一个虚拟继承的派生类的对象 (2).mem是从虚拟基类派

在C++中 怎么在派生类中使用基类中的成员变量 例如如下代码 怎样才能使其跑起来

问题描述 在C++中 怎么在派生类中使用基类中的成员变量 例如如下代码 怎样才能使其跑起来 #include using namespace std; class love{ public: char you() { int i=87, j=74 ,k=89; char a=char(i),b=char(j),c=char(k); return 0; } }; class Me:private love{ public: Me():l(a),u(b),n(c){} char const l,u,

请问:C#中 虚基类 等于 抽象类吗?

问题描述 请问大家:(1)在C#中有虚基类吗?(2)如果有和抽象类有什么区别?在项目开发中主要应用在哪些方面?(3)还有虚方法和抽象方法有什么区别? 解决方案 解决方案二:你可以去www.langsin.com,找抽像类的视频,那里面有介绍解决方案三:C#中没有多继承,所以也就没有虚基类了.虚表示可以重写,运行时绑定,抽象表示只有定义没有实现,含义不一样.解决方案四:没有虚基类虚方法可以由子类来重写,也可以不重写.抽象方法必须由子类来重写.解决方案五:谢谢了解决方案六:C#只允许单继承,没有虚基

实例讲解C++编程中的虚函数与虚基类_C 语言

虚函数① #include "stdafx.h" #include <iostream> using namespace std; class B0//基类B0声明 { public: void display(){cout<<"B0::display()"<<endl;}//公有成员函数 }; class B1: public B0//公有派生类B1声明 { public: void display(){cout<<

C+++中的基类的虚方法在派生类中设为虚的还是非虚方法好?

问题描述 C+++中的基类的虚方法在派生类中设为虚的还是非虚方法好? //brass.h -- bank account classes#ifndef BRASS_H_#define BRASS_H_#include //brass account classclass Brass{private: std::string fullName; //x姓名 long acctNum; //账号 double balance; //当前结余public: Brass(const std::strin

详解C++中基类与派生类的转换以及虚基类_C 语言

C++基类与派生类的转换 在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中全部都按原样保留下来了,在派生类外可以调用基类的公用成员函数访问基类的私有成员.因此,公用派生类具有基类的全部功能,所有基类能够实现的功能, 公用派生类都能实现.而非公用派生类(私有或保护派生类)不能实现基类的全部功能(例如在派生类外不能调用基类的公用成员函数访问基类的私有成员).因此,只有公用派生类才是基类真正的

C++第13周项目3 - 车辆类多重继承中使用虚基类

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8953304 [项目3]在下面一段类的定义中,自行车类的虚基类为车辆类,机动车类的虚基类也为车辆类,摩托车类的基类为自行车类和机动车类,类之间均为公有继承.(1)根据上面各类间关系的描述,补全下面程序段中空缺的代码(2)实现程序中声明的成员函数,注意相应操作中的

Microsoft .NET 中的基类继承

接口继承 创建抽象类时,请使用关键字 Interface 而不是 Class.为接口命名,然后定义需要子类实现的所有属性和方法.这是因为基类中没有可以实现的属性和方法,它只包含一般数据,而不包含方法.您所创建的只是一个合约,它规定所有使用此接口的子类都必须遵循一定的规则. 1.        现在,请在已创建的项目中添加一个新类. 2.        从 Visual Studio 菜单中,单击 Project(项目),然后单击 Add Class(添加类). 3.        在类中添加以下

Microsoft .NET 中的基类继承(2)

现在,请在已创建的项目中添加一个新类. 从 Visual Studio 菜单中,单击 Project(项目),然后单击 Add Class(添加类). 在类中添加以下代码:Interface Person   Property FirstName() As String   Property LastName() As StringSub Print()   Sub Talk()End Interface您会发现,您定义属性和子过程的方法与您通常定义这些属性和过程的方法一样.唯一的差别在于,您没