c++初学者关于对象模型的问题。请大家帮忙看看

chxr 2001-11-12 08:36:56
小弟初学C++。近日在看那本对象模型的时候觉得挺迷糊的。
请问就是比如:
class base
{
private:
int Number;
public:
int a;
..
};
这样的定义中内存的布局应该是按照这种定义的格式来分配的吧。(是么?第20页说的什么意思?)可是有一点书中提到(第12页)base 的class members被直接放入derived中。再看看第30页就发现派生类中包括了基类的vptr.可是派生类自己的vptr呢?
难道没有(应该不会吧)。结合第32页的说的vptr的仲裁的事情挺迷糊的。怎么回事呢。谢谢了。
...全文
91 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
magicblue 2001-11-14
  • 打赏
  • 举报
回复
> 不过是如果有override虚函数的话。则在对应的槽位改写这个函数指针。

不对,你再看看我给的第二个连接。遇到这种情况,编译器的动作是增加一个新的vtable,而不是在原来的vtable上做改动,然后让vptr指向这个新的vtable(这个重指向动作发生在派生类的构造函数的隐含扩展码中)关于这个的比较详细的讨论请看http://www.csdn.net/expert/topic/281/281447.shtm的后半部分(如果有耐性的话:))

1 San_Daniel说的对,好象书上有讲这个问题吧。VC是把vptr放在对象模型的顶端
San_Daniel 2001-11-14
  • 打赏
  • 举报
回复
1.这种方式与C的struct是兼容的,如
struct A
{
int i;
};
struct A
{
int i;
virtual int f();
}
两者的内存布局兼容,数据成员都在对象布局的起始为置

2.不会出问题,填充slot是编译器做的,它完全有能力正确的选择函数
chxr 2001-11-14
  • 打赏
  • 举报
回复
昨天晚上大概看了一下。我的理解是:在单一继承的模式下:一个vptr和一个vtabl.
derived在保存base(包括其vptr)的对象格局不变的情况下。添加自己的member data,
不过是如果有override虚函数的话。则在对应的槽位改写这个函数指针。如果有添加。则
加在vtabl后继的位置上。由于类包括虚拟函数。所以即使没有提供default ctor。
也会被implicit的‘合成’出一个‘nontrival’的default ctor.(四种情况的第三种)
而他的主要功能就是构造这个vtabl等。不知道是不是。请大家帮忙看看。。
后面的多继承还没看。抱歉抱歉。
不过还有两个小疑问:
1。看书上的示意图似乎这个vptr在基类的所有成员数据下面。在派生类的上面。
这样的话。如果是不同的基类的指针的偏移就不一样了么。这样的话不是
不好取了么。似乎是应该放在偏移为0的地方比较统一。。
2。关于顺序的问题:
记得昨天晚上似乎看到了这么一句(抱歉书不在边上。无法验证):按照虚函数的定义
顺序在表中生成槽位。除了前面两个:0个是RTTI的信息。1个是虚拟析构函数。
如果有override则要改写。诶。我想到这么个问题:如果基类是
virtual void fun1();
virtual void fun2();
而派生类是:
void fun2();
void fun1();
则改写的时候不会出什么问题吧。(因为这个顺序不一致。。)
麻烦大家看看。谢谢了。
chxr 2001-11-14
  • 打赏
  • 举报
回复
恩。看看先。还是等俺琢磨的详细点再来请教了。
不过有提到用到张新表。后面一部分虽然没看。不过我觉得指针不是有了两种取值么。
这个似乎不妥。至于vptr具体放在什么地方。我想或许每个编译器处理的不一样。验证一下即可
chxr 2001-11-13
  • 打赏
  • 举报
回复
没有没有。小弟实在是菜鸟一只。虚心向大家学习了。 :)
chenqj 2001-11-13
  • 打赏
  • 举报
回复
初学c++就看对象模型,厉害,呵呵
chxr 2001-11-13
  • 打赏
  • 举报
回复
恩。刚才看了一下。似乎几家说法不一样。
好象答案就在后面是吧。刚才看了一下。大概在第四章吧。让我看看先。。恩。
chxr 2001-11-13
  • 打赏
  • 举报
回复
哦。看看先。呵呵。
qjwj_hl 2001-11-13
  • 打赏
  • 举报
回复
先学dos下对象模型吧。
magicblue 2001-11-12
  • 打赏
  • 举报
回复
在单根继承体系中只有一个vptr

以下是以前回复的一些帖子:(绝对值得一看:))
http://www.csdn.net/expert/topic/331/331195.shtm
http://www.csdn.net/expert/topic/312/312233.shtm

70,032

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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