读书人

虚函数表指针的有关问题

发布时间: 2013-08-23 15:57:36 作者: rapoo

虚函数表指针的问题

#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

读书人网 >C++

热点推荐