huoyahuoya 2017-08-18 03:02 采纳率: 0%
浏览 859
已采纳

类/对象的大小问题,关于virtual虚继承

class A{};
class B{
virtual void func0() {}
};
class C{
virtual void func1() {}
};
class D:public B, public C{
virtual void func2() {}
};
class E:public B, public C{
};
这里D和E大小一样,为啥,本身的虚基类表指针呢?发生了什么操作

  • 写回答

3条回答 默认 最新

  • 郭建堂 2017-08-18 06:03
    关注
    
    #include <iostream>
    
    using namespace std;
    
    class A{};
    
    class B
    {
        virtual void func0() {
            cout << "B func0"<<endl;
        }
    };
    
    class C
    {
        virtual void func1()
        {
            cout << "C func1"<<endl;
        }
    };
    
    class D:public B , public C
    {
        virtual void func2()
        {
            cout << "D func2()" <<endl;
        }
    };
    
    class E:public B, public C
    {
    };
    
    int main()
    {
        D d;
    
        long *p2Class = (long *)&d;
    
        long *p2VTB = (long *) ( *p2Class );
    
    
        //第一张虚函数表 begin
        long *p2Fun = NULL;
    
        p2Fun = (long *)(*(p2VTB));
        ((void (*) ())p2Fun)();           //cout-->B func0
    
        p2Fun = (long *)(*(p2VTB + 1));
        ((void (*) ())p2Fun)();           //cout-->D func2
        //第一张虚函数表 end
    
        //第二张虚函数表 begin
        long *p2VTC = (long *) ( *(p2Class + 1) );
    
        p2Fun = (long *)(*(p2VTC));
        ((void (*) ())p2Fun)();           //cout-->C func1
    
        /*
        p2Fun = (long *)(*(p2VTC + 1));
        ((void (*) ())p2Fun)();           //报错
         */
        //第二张虚函数表 end
    
        return 0;
    }
    
    

    我是64位的, 验证得出, 本身的虚基类表指针被和B的虚函数指针放在同一张虚函数表里, C的虚函数表里没有.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 运筹学中在线排序的时间在线排序的在线LPT算法
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧