博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
虚继承
阅读量:6327 次
发布时间:2019-06-22

本文共 1315 字,大约阅读时间需要 4 分钟。

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

你可能感兴趣的文章
测试应该在产品开发的哪个阶段进入?
查看>>
SELinux安全
查看>>
大话IT第21期:红帽资助四大开源基金会
查看>>
浅谈微服务的来龙去脉
查看>>
项目经理,别让猴子跳回背上!
查看>>
NetBackup下ORACLE恢复测试方案实例解析
查看>>
【有奖征文】“失业”程序员的苦辣酸甜
查看>>
nagios监控web/mysql多角度实战分享(一)
查看>>
SCOM 2012系列⑦即时消息通知上
查看>>
IE9是如何被FireFox4超越全球市场份额的?
查看>>
linux bunzip2命令
查看>>
敏捷个人:通过实践TOGAF来思考如何学习并应用新的方法?
查看>>
Android系统的开机画面显示过程分析(6)
查看>>
vivo Hi-Fi+QQ音乐 数字音乐市场的一剂良方
查看>>
Cocos2d-x 3.2 异步动态加载 -- 保卫萝卜开发总结
查看>>
聚焦触宝反侵权事件:中国创业者用什么护航海外市场大门
查看>>
AOP技术基础
查看>>
Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析(2)
查看>>
Lync 小技巧-5-当前已暂停共享
查看>>
无线802.11n 2.4G与5G性能测试
查看>>