首页 > 其他 > 详细

虚继承

时间:2014-04-03 10:15:27      阅读:446      评论:0      收藏:0      [点我收藏+]

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

虚继承,布布扣,bubuko.com

虚继承

原文:http://www.cnblogs.com/zhouzhuo/p/3641614.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!