vptr和vtbl的问题?

cba_v 2008-11-30 11:11:34
例如:

class Base
{
public:
Base(){}
virtual void newfun(){cout<<"Base::newfun!"<<endl;}
};

class Derived : public Base
{
public:
Derived(){}
virtual void oldfun(){cout<<"Derived::oldfun!"<<endl;}
};

1: 在基类 和 派生类 中分别声明了 不同的虚函数 那产生 几个 虚函数表啊? 是一个吗?
2: 在派生类中 也是只有 一个 虚指针吗(这个虚指针 就是 基类的虚指针?)? 如果是一个虚表和一个虚指针的话 那不是有点混乱了吗?
我认为 派生类中的虚函数 就是 虚指针指向基类虚函数的偏移量, 不知道 是否正确?
3: 我想用 类型强制转换来输出 基类的虚函数

int main()
{
base pp;
*(int*)*(int*)(&pp); //?
getchar();
return 0;
}

但是 什么也没有 不知道该怎么转换的?
谢谢了
...全文
157 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2008-12-01
  • 打赏
  • 举报
回复
真的有兴趣呢,就去看《深度探索C++对象模型》。
另外,精通C++的内部细节对实际编程没啥意义,纯满足好奇心。所以,建议不要在这话题上花太多精力。有其它太多东西需要学了。
cba_v 2008-12-01
  • 打赏
  • 举报
回复
谢谢 楼上两位的回答
to sys0006
1: 派生类中的虚指针 是否就是基类的虚指针? 是否不管 几重派生 都只有一个 虚表 就是 基类 产生的哪个?
2: 为什么是 两个虚表 是不是看有几个 基类?
是不是 有几个 基类 就有几个 虚表? 而 派生类不产生虚表? 它的虚表 就是基类的 而虚指针 也就是基类的?
但是 下面这个代码中的派生类中 的虚函数 在哪个 虚表上啊?
class A
{
public:
virtual test1(){}

};
class B
{
public:
virtual test2(){}
};

class C : public A, public B
{
public:
virtual test3(){}
};

梦之安魂曲 2008-12-01
  • 打赏
  • 举报
回复
一个类只要有虚函数就有一个VPTR,指向唯一的一个VTABLE,只要基类不增加虚函数,它的的表格式应该是一样的,只是所指向的函数地址不同。想输出基类的虚函数可用以下方法。class A
{
int x;
public:
A():x(0){}
A(int n):x(n){}
virtual void func()
{cout<<"a func()"<<x<<endl;}//在这行加A::func()可以太到目的。
};
class B:public A
{
int x;
public:
B(int n):x(n){}
void func()
{cout<<"b func()"<<x<<endl;}
};

int main(int argc, char *argv[])
{
B *p=new B(10);
p->func();
p->A::func();//前面加一个类域选择符也可。
vincent_nicole 2008-12-01
  • 打赏
  • 举报
回复
在单一继承体系下,一个类维护一张虚表
如果派生类中重新写了基类的虚函数,那么这张虚表中的函数将被更新
如果派生类中新定义了虚函数,那么将该函数追加到虚表上
cba_v 2008-12-01
  • 打赏
  • 举报
回复
to taodm
刚开始看 这本书
主要是 看看 类的一些 机制
sys0006 2008-11-30
  • 打赏
  • 举报
回复
2)如果

class A
{
public:
virtual test1(){}

};
class B
{
public:
virtual test2(){}
};

class C : public A, public B
{
public:
virtual test3(){}
};


C有两个虚表
sys0006 2008-11-30
  • 打赏
  • 举报
回复
1.一个
2.派生类里也是一个,指向一个虚表,这个虚表里包含基类的虚函数地址和本身的虚函数地址
3.

typedef void (*Fun)(void);
int main()
{

base pp;
Fun pFun = (Fun)*(int*)*(int*)(&pp);
pFun();
getchar();
return 0;
}


具体可参考:
http://www.codeproject.com/KB/atl/atl_underthehood_.aspx

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧