zpcdcsdn 2016-01-13 03:31 采纳率: 0%
浏览 1496

请教大家一个在虚析构函数存在时,C++虚函数表的问题

下面是在下的代码:

 #include <iostream>
using namespace std;

class Point
{
private:
    int X;
    int Y;
public:
    Point() {}
    Point(int x, int y) : X(x), Y(y) {}

    const int getX() { return X; }
    const int getY() { return Y; }
    virtual ~Point() {}
    virtual void printX() { cout << "X=" << X << endl; }
    virtual void printY() { cout << "Y=" << Y << endl; }

};

class Point3D :public Point
{
private:
    int Z;
public:
    Point3D()
        :Point()
    {}
    Point3D(int x, int y, int z)
        :Point(x, y), Z(z)
    {}
    const int getZ() { return Z; }
    virtual ~Point3D() {}
    virtual void printZ() { cout << "Z=" << Z << endl; }
    virtual void fun() { cout << "fun" << endl; }

};

int main()
{
    typedef void(*Funptr)();
    Point point(1, 2);
    Point3D point3D(1, 2, 3);
    Point3D* p3D = &point3D;
    void*** _p3D = (void***)&point3D;
    void** vfptr3D = *_p3D;
    int** ptr3D = (int**)vfptr3D;
    while (*ptr3D != NULL)
    {
        cout << *ptr3D << endl;
        ptr3D++;
    }
    cout << "--------------------------" << endl;
    Point* p = &point;
    void*** _p = (void***)&point;
    void** vfptr = *_p;
    int** ptr = (int**)vfptr;
    while (*ptr != NULL)
    {
        cout << *ptr << endl;
        ptr++;
    }
    return 0;
}

在上面的代码中,在下打印了派生类和基类的虚函数表,结果如下
图片说明
按理说,基类的虚函数表只有三项,分别对应~point(),printX(),printY(),如下图
图片说明
但大家也发现了,打印出的结果中最后多了一项!这是在VS2015下的结果,如果在codeblocks12.11下,连派生类的虚函数表最后也会多出一项,如下
图片说明
但是,只要去掉虚析构函数,就不会出现意料之外的多余项,可见出现多余项与类中含有虚析构函数有关,但在下又想不明白这是为什么,所以特向大家请教,希望各路大神能够不吝赐教,在下先行谢过!

  • 写回答

3条回答 默认 最新

  • 关注

    虚表是编译器相关的,vs2013根vs2015在处理虚表上有很大的区别。
    下图是我在vs2013上面测的,跟你的理解是相符合的,你应该记住,对虚表的处理牵扯到时间空间效率的问题,随着编译器版本的改变。我觉得微软
    是对虚表的处理改变了方法,并且提高了某种效率,或者是在二者之间取到了一个折衷。
    图片说明

    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料