• 虚继承


    例题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

  • 相关阅读:
    C++之容器
    C++之复制控制
    TCP的3次握手/4次握手
    linux编程之多线程编程
    linux编程之信号
    linux编程之共享内存
    MySQL数据库优化
    MySQL存储引擎InnoDB与Myisam
    Redis--持久化
    Redis 请求应答模式和往返延时 Pipelining
  • 原文地址:https://www.cnblogs.com/zhouzhuo/p/3641614.html
Copyright © 2020-2023  润新知