如何理解虚表及其计算含虚函数的类的大小-创新互联

在什么情况下系统会自动生成缺省(默认)的构造函数?

创新互联建站主营兰山网站建设的网络公司,主营网站建设方案,成都App定制开发,兰山h5重庆小程序开发公司搭建,兰山网站营销推广欢迎兰山等地区企业咨询

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、类是虚拟继承

class B

{

public:

    B()

    {}

};

class D:virtual public B

{

public:

    D()

    { }

    B b;

};

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

3、基类有缺省构造函数,子类没有显示定义自己的构造函数

class B

{

public:

    B(int data=0)

    {}

};

class D: public B

{

public:

};

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

4、有虚函数的类,系统自动生成缺省的构造函数来初始化虚指针

class B

{

public:

    virtual  void fun()

    {

        cout << "fun" << endl;

    }

};

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

前面是一些构造函数方面的总结,菜鸟一个写的太烂,进来的先凑合着看,会不定时补充,有错误的地方还请多多指点

****************************************************************************************

虚函数:

class Base

{

public:

    virtual void FunTest()

    {

        cout << "Base::FunTest()" << endl;

    }

    virtual void FunTest1()

    {

        cout << "Base::FunTest1()" << endl;

    }

    virtual void FunTest2()

    {

        cout << "Base::FunTest2()" << endl;

    }

    virtual void FunTest3()

    {

        cout << "Base::FunTest3()" << endl;

    }

    virtual void FunTest4()

    {

        cout << "Base::FunTest4()" << endl;

    }

};

int main()

{

    Base b;

    system("pause");

    return 0;

}

  Base b;

009253E8  lea         ecx,[b]

009253EB  call        Base::Base (0921226h)

有call命令说明编译器有合成缺省构造函数

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

取b的地址,b指向的那块空间里存放着另一个地址,该地址指向的空间存放着虚表地址

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

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

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

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

虚指针指向虚表

虚表的顺序和函数的声明顺序是一样的

虚函数的大小:

***************************计算大小*********************************

class C

{

public:

char a;  //1

static char b;  //静态成员在静态区域,不在栈区,所以不算

void *p;   //指针占4个字节

static int *c;  //静态成员在静态区域,不在栈区,所以不算

virtual void func1()

{}

virtual void func2()

{}

//虚函数属于同一类,故只需要一个这个指针指向虚函数表,

//占用4个字节,就算有N个虚函数,也是4个字节

};

int main()

{

C c;

cout << sizeof(C) << endl;   //12

cout << sizeof(c.a) << endl;   //1

cout << sizeof(c.b) << endl;  //1   类型的大小

cout << sizeof(c.c) << endl;   //4   类型的大小

cout << sizeof(c.p) << endl;   //4

return 0;

}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网站栏目:如何理解虚表及其计算含虚函数的类的大小-创新互联
文章出自:http://azwzsj.com/article/cdoecd.html