含有虚函数的类sizeof大小

#include <iostream>
using namespace std;

class Base1{
    virtual void fun1(){}
    virtual void fun11(){}
public:
    virtual ~Base1();
};

class Base2{
    virtual void fun2(){}
};

class DerivedFromOne: public Base2
{
    virtual void fun2(){}
    virtual void fun22(){}
};

class DerivedFromTwo: public Base1, public Base2
{
    virtual void fun3(){}
};

void main()
{
    cout << "sizeof Base1 " << sizeof(Base1) << endl;
    cout << "sizeof Base1 " << sizeof(Base2) << endl;
    cout << "sizeof FromOne " << sizeof(DerivedFromOne) << endl;
    cout << "sizeof FromTwo " << sizeof(DerivedFromTwo) << endl;
    getchar();
}

打印结果为:

说明:

1)一个类中若有虚函数,(不论是自己的虚函数,还是继承而来的),那么类中就有一个成员变量:虚函数指针,这

个指针指向一个虚函数表,虚函数表的第一项是类的typeinfo信息,之后的项为此类的所有虚函数的地址。

2)假设经过成员对齐后的类的大小为size个字节。那么类的sizeof大小可以这么计算:size + 4*(虚函数指针的个数

n)。代码中,DerivedFromTwo继承自2个分支,所以有2个虚函数指针,所以sizeof大小为0 + 4* 2 = 8。

3)带有虚函数的类的sizeof大小,实际上和虚函数的个数不相关,相关的是虚函数指针。

以上截图为在64位机器上运行的结果,因此指针大小为8字节。

时间: 2024-10-18 09:02:15

含有虚函数的类sizeof大小的相关文章

空类,含有虚函数的类的大小

1.为何空类的大小不是0呢? 为了确保两个不同对象的地址不同,必须如此. 类的实例化是在内存中分配一块地址,每个实例都有独一无二的内存地址.空类也会实例化,为保证空类实例化后的独一无二性,编译器会给空类隐含的添加一个字节.所以,空类的sizeof为1,而不是0. 2.继承关系中的类大小: case 1: 父类有虚函数,子类继承. class A{ virtual void f(){} }; class B:public A{} 此时,类A和类B都不是空类,其sizeof都是4,因为它们都具有虚函

如何理解虚表及其计算含虚函数的类的大小

在什么情况下系统会自动生成缺省(默认)的构造函数? 1.在类里面有一个类类型的对象,这个类有自己的缺省构造函数(有缺省的参数,参数有缺省值). class B { B(int data) {  } };不能合成 class B { B(int data=0) {  } };会合成 class B { public: B(int data=0) {  } }; class C:public B { public: C() :B(0) {  } B b;  //编译器会自动合成 }; 2.类是虚拟继

含有虚函数菱形的虚拟继承(没有对虚函数进行重写)

在VS2013编程,调试 问题 :  菱形继承会引来,二义性 1.源代码 </pre><pre name="code" class="cpp">#include <iostream> using namespace std; class Base { public: virtual void FunTest() { cout << "Base::FunTest () " << endl;

构造函数为什么不能为虚函数 &amp; 基类的析构函数为什么要为虚函数

一.构造函数为什么不能为虚函数 1. 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的.问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数. 2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用.构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀.所以构造函数没有必要是虚函

Base类sizeof大小 -- C++

Base类只是一个指针,所以Base大小是4个字节. 但Base类中添加一个int a,Base的大小变成8字节. #include <iostream> #include <complex> using namespace std; class Base1 { public: Base1(){cout << "Base1" << endl;} ~Base1(){cout << "~Base1" <&

类中含有虚函数的剖析

1. 源代码 #include <iostream> using namespace std; class Base { public : virtual void  FunTest() { cout << "Base::FunTest () " << this << endl; } virtual void  FunTest1() { cout << "Base::FunTest1 () " <&l

关于虚函数,类的内存分布以及类的成员函数调用原理

1.类的内存分布 空类为了占位,空间占一个字节 成员函数,静态函数,静态变量并不占内存(不和类放在一起) 所有的虚函数也并不和类放在一起,而是将所有的虚函数构造成一个虚函数表,用一个指针指向这个虚函数表,类仅仅存储这个指针,一个指针在32位的机器上占四个字节 所有的非静态成员变量占内存 因此,类的内存分布=所有的非静态成员变量+虚指针(自创的名词:即指向虚函数表的指针) 2.虚函数的原理 一个非继承的类:一个虚指针(指向他的虚函数表). 一个单继承的类:一个虚指针(指向他的虚函数表,这个虚函数表

第13周项目2-纯虚函数形类家庭

写一个程序.定义一个抽象基类Shape,它是从衍生3派生类.Circle(周围).Rectangle(矩形).Triangle(三角).例如,下面的main()性能.划定区域并找到一些几何. int main() { Circle c1(12.6),c2(4.9);//建立Circle类对象c1,c2,參数为圆半径 Rectangle r1(4.5,8.4),r2(5.0,2.5);//建立Rectangle类对象r1,r2,參数为矩形长.宽 Triangle t1(4.5,8.4),t2(3.

【整理】C++虚函数及其继承、虚继承类大小

参考文章: http://blog.chinaunix.net/uid-25132162-id-1564955.html http://blog.csdn.net/haoel/article/details/1948051/ 一.虚函数与继承 1.空类,空类单继承,空类多继承的sizeof #include <iostream> using namespace std; class Base1 { }; class Base2 { }; class Derived1:public Base1