C++之对象模型

#include <iostream>
using namespace std;

class BB
{
public:
    virtual void vfbb()
    {
        cout << "BB::vfbb ..." << endl;
    }
    virtual void vfbb2()
    {
        cout << "BB::vfbb2 ..." << endl;
    }

    int bb_;
};

class B1 : virtual public BB
{
public:
    virtual void vfb1()
    {
        cout << "B1::vfb1 ..." << endl;
    }

    int b1_;
};

class B2 : virtual public BB
{
public:
    virtual void vfb2()
    {
        cout << "B2::vfb2 ..." << endl;
    }

    int b2_;
};

class DD : public B1, public B2
{
public:
    virtual void vfdd()
    {
        cout << "DD::vfdd ..." << endl;
    }

    int dd_;
};

typedef void (*FUNC)();
int main() {
    cout << sizeof(BB) << endl;
    cout << sizeof(B1) << endl;
    cout << sizeof(DD) << endl;

    BB bb;
    long** p;
    p = (long**)&bb;  // 根据编译器不同,有时候可以用p = reinterpret_cast<long**>(&bb);转化
    FUNC fun;
    fun = (FUNC)p[0][0];  // 根据编译器不同,有时候可以用reinterpret_cast<FUNC>(p[0][0]);
    fun();
    fun = (FUNC)p[0][1];
    fun();
    cout << endl;

    B1 b1;
    p = (long**)&b1;
    fun = (FUNC)p[0][0];
    fun();
    fun = (FUNC)p[3][0];
    fun();
    fun = (FUNC)p[3][1];
    fun();
    cout << p[1][0] << endl;
    cout << p[1][1] << endl;
    cout << endl;

    DD dd;
    p = (long**)&dd;
    fun = (FUNC)p[0][0];
    fun();
    fun = (FUNC)p[3][0];
    fun();
    fun = (FUNC)p[7][0];
    fun();
    fun = (FUNC)p[7][1];
    fun();

    cout << p[1][0] << endl;
    cout << p[1][1] << endl;
    cout << p[4][0] << endl;
    cout << p[4][1] << endl;
    cout << endl;

    return 0;
}

代码输出:

总结:

虚继承,里面就会有vbptr这个指针,因为虚继承是为了解决菱形继承中变量的二义性,使派生类中只有一份基类的成员变量,所以需要这个vbptr来记录里面的两个偏移量。

虚函数,里面就会有vptr这个指针,用来指向虚函数。

内存模型:

相关推荐

  1. C++新经典对象模型第6章 对象构造语义学

    2024-06-07 20:14:03       37 阅读
  2. 通过C++对象模型优化C++程序

    2024-06-07 20:14:03       26 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-07 20:14:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-07 20:14:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-07 20:14:03       82 阅读
  4. Python语言-面向对象

    2024-06-07 20:14:03       91 阅读

热门阅读

  1. 【设计模式】策略模式(行为型)⭐⭐

    2024-06-07 20:14:03       29 阅读
  2. Secure Boot原理和高通芯片Secure Boot原理

    2024-06-07 20:14:03       29 阅读
  3. 如何评价GPT-4o?

    2024-06-07 20:14:03       24 阅读
  4. 数学部分学习

    2024-06-07 20:14:03       25 阅读
  5. 书籍数字字符串转换为字母组合的种数(4)0607

    2024-06-07 20:14:03       31 阅读
  6. Qt程序打包

    2024-06-07 20:14:03       31 阅读