虚继承

例题1:

#include <iostream>

#include <memory.h>

#include <assert.h>

using namespace std;

class A {

    char k[3];

public:

    virtual void aa() {

    }

    

};

class B : public virtual A {

    char j[3];

public:

    virtual void bb() {

    }

};

class C : public virtual B {

    char i[3];

public:

    virtual void cc() {

    }    

};

int main() {

    cout << "sizeof(A)" << sizeof(A) << endl;

    cout << "sizeof(B)" << sizeof(B) << endl;

    cout << "sizeof(C)" << sizeof(C) << endl;

    

    return 0;

}

这道题在 VS 下的答案是 8, 20, 32. 程序员面试宝典的答案是 8, 16, 24.

VS 的答案可根据上一篇 Post, C++ 对象内存布局分析出来.

class A. 指向虚函数表的指针, 4字节. char k[3] 对齐后 4 字节, 总共 8 字节

class B. 指向虚函数表的指针, 4字节. 指向虚基类的指针 4 字节, char [3] 对齐后 4 字节. class A 的虚函数表指针 4 字节. class A 的数据部分, 4 字节.

class C. C 的部分 12 字节, 再加上 class B 的部分, 32 字节.

例题2:

class A {

    int m_na;

};

class B {

    int m_nb;

};

class C : public A, public B {

    int m_nc;

};

int main() {

    C* pc = new C();

    

    B* pb = dynamic_cast<B*> (pc);

    A* pa = dynamic_cast<A*> (pc);

    if(pc == pb)

        cout << "Equal" << endl;

    else

        cout << "Not Equal" << endl;

    if(int(pc) == int (pb))

        cout << "Equal" << endl;

    else

        cout << "Not Equal" << endl;

    return 0;

}

当执行代码 if(pc == pb) , 两端的数据类型不同, 比较时需要进行类型转换. 代码变成 pc == (C*) Pb 这样的话, eaual

pb 实际指向的是对象 C 中子类的 B 部分, 从地址上和 pc 不一样, 所以第二个比较, 输出 not equal.

另外, 输出 pa, pb, pc 的值会发现 pa = pc, pb >= pb

原文地址:https://www.cnblogs.com/zhouzhuo/p/3641614.html