zoukankan      html  css  js  c++  java
  • 虚函数指针

    参考:

    1、http://hi.baidu.com/scarlettgy/item/1cc4500a21f41be4fe240d73,讲解了一般的虚指针中虚函数表的建立过程(包括单继承、多继承)

    2、http://blog.csdn.net/hackbuteer1/article/details/7883531,讲解了虚继承的不同处理。

    计算类的内存空间占有的方法:(从最里层的类算起)

    计算基类的内存占有数

    (有虚函数,增加4个字节的指向虚函数表的指针,加上类成员的内存占有数)

    派生类

    当本类或者基类有虚函数时

    (一般继承4个字节(指向本身虚继承表的指针)、虚继承8个字节(指向本身虚继承表的指针和指向基类虚函数表的指针))

    (当没有虚函数时)

    (不计算这类指针的内存)

    最后,计算类自身的数据成员的内存占有。

    考虑内存对齐问题。

    一般继承:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 class C180
     5 {
     6 public:
     7 
     8     C180() {
     9         foo();
    10         this->foo();
    11     }
    12     virtual void foo() {
    13         cout << "<< C180.foo this: " << this << " vtadr: " << *(void**)this << endl;
    14     }
    15 };
    16 
    17 class C190 : public C180
    18 {
    19 public:
    20 
    21     C190() {}
    22     virtual void foo() {
    23         cout << "<< C190.foo this: " << this << " vtadr: " << *(void**)this << endl;
    24     }
    25     virtual void goo() {}
    26 };
    27 
    28 void main ()
    29 {
    30     C180 obj180;
    31     C190 obj190;
    32     //obj.foo(); 
    33 
    34     cout << sizeof(obj180) << endl;
    35     cout << sizeof(obj190) << endl;
    36 }
    1 class C190 size(4):  
    2      | +---  
    3      | +--- (base class C180)  // C180 
    4        | | {vfptr}
    5        //C180没有基类结束  
    6      +--- 

     基类C180:4个字节;

    派生类C190:4个字节;// 没有增加字节,只是改变了基类的虚函数表的内存布局数据

    虚继承:

     1 class CommonBase
     2 {
     3     int co;
     4 };
     5 
     6 class Base1: virtual public CommonBase
     7 {
     8 public:
     9     virtual void print1() {  }
    10     virtual void print2() {  }
    11 private:
    12     int b1;
    13 };
    14 
    15 class Base2: virtual public CommonBase
    16 {
    17 public:
    18     virtual void dump1() {  }
    19     virtual void dump2() {  }
    20 private:
    21     int b2;
    22 };
    23 
    24 class Derived: public Base1, public Base2
    25 {
    26 public:
    27     void print2() {  }
    28     void dump2() {  }
    29 private:
    30     int d;
    31 };
    class Derived size(32):
         +---
         | +--- (base class Base1)
     | | {vfptr}   //4
     | | {vbptr}  //4
     | | b1          //4
         | +---
         | +--- (base class Base2)
     | | {vfptr}   //4
     | | {vbptr}  //4
     | | b2          //4
        | +---
     | d              //4
        +---
        +--- (virtual base CommonBase) //虚继承的基类只算一次,且放到最后算
     | co            //4
        +---

    32字节

  • 相关阅读:
    ionic3 学习记录
    关于华为 IOT平台的框架理解
    遥测浮点数的计算 十进制浮点型转为十六进制浮点型
    关于104规约的认识补充
    Php 十六进制短浮点数转十进制,带符号位
    yii2 项目初始化
    java Socket启动服务
    ionic3 关于屏幕方向问题
    ionic3 cordova ionic-native插件
    java javac 的区别
  • 原文地址:https://www.cnblogs.com/xuxu8511/p/2714027.html
Copyright © 2011-2022 走看看