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条)

报告相同问题?

悬赏问题

  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错
  • ¥15 换yum源但仍然用不了httpd
  • ¥50 C# 使用DEVMOD设置打印机首选项
  • ¥15 麒麟V10 arm安装gdal
  • ¥20 OPENVPN连接问题
  • ¥15 flask实现搜索框访问数据库
  • ¥15 mrk3399刷完安卓11后投屏调试只能显示一个设备
  • ¥100 如何用js写一个游戏云存档