首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

虚函数表指针的有关问题

2013-08-23 
虚函数表指针的问题#includeiostreamusing namespace stdclass Base{public:virtual void f() { cout

虚函数表指针的问题

#include<iostream>
using namespace std;
class Base
{
public:
    virtual void f() { cout << "Base::f" << endl; }
    void g() { cout << "Base::g" << endl; }
    virtual void h() { cout << "Base::h" << endl; }
private:
    int n;
};
class Derive1 : public Base
{ // 重写一个虚函数
public:
    virtual void f() { cout << "Derive1::f" << endl; }
    // virtual void h() { cout << "Derive1::h" << endl; }
};
class Derive2 : public Base
{ // 重写两个虚函数
    virtual void f() { cout << "Derive2::f" << endl; }
    virtual void h() { cout << "Derive2::h" << endl; }
};
class Derive3 : public Base
{ // 重写两个函数,并增加一个虚函数
    virtual void f() { cout << "Derive3::f" << endl; }
    virtual void j() { cout << "Derive3::j" << endl; }
    virtual void h() { cout << "Derive3::h" << endl; }
};
    typedef void (*Func)(void);
int main()
{
    Derive1 derive1;
    Func pFun = NULL;
    cout << "Derive1大小" << sizeof(Derive1) << endl;
    int* pDeriveVtable = (int*)(*(int*)(&derive1));
    cout << "虚表地址:" << pDeriveVtable << endl;
    
    cout << "虚表第一项地址:" << (int*)(*pDeriveVtable) << endl;
    cout << "虚表第一项调用输出:" << endl;
    pFun = (Func)(*pDeriveVtable);
    pFun();
    cout << "下一个的地址:" << (int*)(*(pDeriveVtable + 1)) << endl;
    cout << "下一个的调用输出:" << endl;
    pFun = (Func)(*(pDeriveVtable + 1));


    pFun();
    
    cout << "再下一个是什么呢:" << (int*)(*(pDeriveVtable + 2)) << endl;
    cout << "Derive1测试结束" << endl;
}


运行结果:
Derive1大小8
虚表地址:0x4031f0
虚表第一项地址:0x401e54
虚表第一项调用输出:
Derive1::f
下一个的地址:0x401e18
下一个的调用输出:
Base::h
再下一个是什么呢:0
Derive1测试结束
Derive1的虚表地址和Base的虚表地址不一样。
1、是不是证明父类与子类各有一个虚函数表?
2、也就是说父类子类不共用一个虚函数表指针,即虚函数表指针不唯一? c++ 虚函数表 虚函数表指针
[解决办法]
父类和子类都有各自的虚函数表。都有各自独立的虚函数表指针。
[解决办法]
每个虚函数所在类都要相应构造一个虚表,
运行时,由构造函数把表的入口地址填入该对象的起始位置。
[解决办法]
建议楼主在VC6.0下调试,观察内存,就可以清楚的看到事实了。
[解决办法]
>也就是说父类子类不共用一个虚函数表指针,即虚函数表指针不唯一?
同一个类的不同对象共用同一个vtable。不同类还共用那还要多态还要vtable干啥?

顺便你func的签名和你成员函数其实是不一样的,你这样做没有出错只是因为那几个成员函数里没有用到this

热点排行