记录一个C++虚继承内存地址相关问题


运行环境:64位win电脑

贴出代码

// 解决菱形继承问题


#include <iostream>

using std::cout;
using std::endl;

class A {
public:
    int a; 
public:
    A() {
        cout << "A constructor" << endl;
    }  
};

class A2 : virtual public A{ //在类的首地址生成一个虚基表指针,占8字节
public:
    A2() {
        cout << "A2 constructor" << endl;
    }
};


class A1 : virtual public A{ //在类的首地址生成一个虚基表指针,占8字节
public:
    A1() {
        cout << "A1 constructor" << endl;
    }
};


// 调用父类构造函数顺序?
// 调用父类构造函数与父类继承顺序有关,析构顺序相反
class Derived : virtual public A1, virtual public A2 {
public:
    Derived() {
        cout << "Derived constructor" << endl;
    }
};

int main() {
    
    cout << sizeof(A) << endl;
    cout << sizeof(A1) << endl;
    cout << sizeof(A2) << endl;
    cout << sizeof(Derived) << endl;

    A a;
    cout << "Address a = " << &a << endl;
    cout << "Address a.a = " << &a.a << endl;


    A1 a1;
    cout << "Address a1 = " << &a1 << endl;
    cout << "Address a = " << &a1.a << endl;

    A2 a2;
    cout << "Address a2 = " << &a2 << endl;
    cout << "Address a = " << &a2.a << endl;

    Derived d;
    // 问题一:为啥65行于68行输出地址相差8字节
    cout << "Address d = " << &d << endl;

    //问题二:为啥下面3行输出地址一样
    cout << "Address a = " << &d.a << endl;
    cout << &(d.A1::a) << endl;
    cout << &(d.A2::a) << endl;

    return 0;

}

问题一

当代码中class Derived : virtual public A1, virtual public A2{}改成class Derived : public A1, public A2{}的时候,会出现代码中的问题一,字节相差数量由8变成16,那么相差16我知道是存储了2个8字节的虚基表指针,相差8字节的话可以理解成存储1个8字节的虚基表指针吗?

但是sizeof(Derived)在代码改变前后一直不变为24.
如果理解成存储1个8字节的虚基表指针,那么按照8字节对齐,为啥sizeof(Derived) = 24
字节相差数量 = 16,可以理解存储了2个8字节的虚基表指针,最后8字节存储两个int

问题二:对于代码中,为啥出现下面问题

    问题二:为啥下面3行输出地址一样
    cout << "Address a = " << &d.a << endl;
    cout << &(d.A1::a) << endl;
    cout << &(d.A2::a) << endl;

有待解决


文章作者: Axieyun
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Axieyun !
评论
评论
  目录