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 请提供一个符合要求的网页链接。
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码