Inside the C++ Object Model 学习笔记 第四章 函数语意学

来源:互联网 发布:东方财富有几种软件 编辑:程序博客网 时间:2024/04/29 14:49

这章主要讲了以下几个问题

1.成员函数的各种调用方式

2.虚成员函数

3.指向成员函数的指针

第一个问题,成员函数的各种调用方法。

成员函数 又分为三种,nostatic member, static member,以及virtual member function。

个人觉得比较简单,简要介绍

nostatic member:分下面几步。

第一步:加个this指针。有了它class object就可以调用它了。

第二步:通过这个this可以调用class object 里边的data member了

第三步:将member function重新写成一个外部函数 名称处理一下,编译器搞定它。

在名称处理的过程中,书中讲了一个名称的特殊处理,就是区分函数德尔一个处理,很简单。

virtual member function

书上例子:

如果normalize()是个vritual member function, 那么

ptr—>normalize;

将会转化为:

(*ptr->vptr[1])(ptr);

其中 vptr表示虚函数指针,在object中。

1代表了virtual table slot 的索引值。关联到normalize()函数。

第二个ptr 代表了this指针。

static member function  与前两个的区别就是没有this指针,就麻烦了,比较不规则。它不用classobject就能调用了。具体的见p151

第二个问题 虚成员函数

基本的就不记了,虚函数表。虚函数指针,type_info。覆盖什么的。这些东西学c++的估计见到都想吐了。搞个多重继承的。

看出它的们地关系了吧:好 加个代码测试一下

要想知道结果么

就在这里,是我修改别人的,它那个根本搞不出来。

这里要说下

就是这个B不是继承了A1和A2么 当我们定义个

A2 *pa2 = new B;的时候,this指针要进行调整,本来this指向了A2么,现在要指向B了,你得动啊

加个offset,也就是sizeof(A1)。这是编译器给我们做的。

//虚拟c++代码

this += sizeof(A1);

B::~B(this);

懂了吧,如果想仔细看 ,书上165页有图,可以看看。

下一个问题,指向Member Function的pointer

时间比较急,就不写了 把我写的一个很乱的代码给大家看看,大家就知道怎么回事了

这里最重要的上就是有的是通过object调用的 有的不是, 结果就不同了 一个是offset一个是真正的地址,呵呵。 去开会了。。。

要考试了  加油啊。 哎。

原创粉丝点击