读书日记2012/2/09

     

《深入探索c++对象模型》第四章:Function语意学(The Semantics of Function)。这一章主要介绍了,在c++中对function member的实现,编译器做的事,重点在virtual function中编译器是怎么样实现的。

一.

1.

  Point3d obj;

      Point3d *ptr=&obj;

     

      obj.normalize();

      ptr->normalize();

问题1:会发生什么事?(分情况讨论)

其中的Point3d:normalize()的定义如下:

Point3d

Point3d::normalize() const

{

      Register float mag=magnitude();

      Point3d normal;

      normal._x=_x/mag;

      normal._y=_y/mag;

      normal._z=_z/mag;

      return normal;

}

 

Point3d::magnitude()定义如下

float

Point3d::magnitude() const

{

      Return sqrt(_x*_x+_y*_y+_z*_z);

}

问题2:怎么样判断一个function不是static

 

二.Member的各种调用方式

      1.Nonstatic Member Functions(非静态成员函数)

           编译器内部已将“member函数实体”转换为对等的“nonmember 函数实体”

      问题3:对以下函数进行转换

float

Point3d::magnitude() const

{

   Return sqrt(_x*_x+_y*_y+_z*_z);

}

 

2.Virtual Member Functions (虚拟成员函数)

      假设normalize()是一个virtual member function,那么以下的调用:

      ptr->normalize();

      obj.normalize();

 问题4:内部应该转化为什么?

3.Static member Functions(静态成员函数)

      假设normalize()是一个Static member function,那么以下的调用:

      ptr->normalize();

      obj.normalize();

 问题5:内部应该转化为什么?

      如果取一个static member function的地址,获得的将是其在内存中得位置,也就是其地址。其地址类型是一个“nonmember 函数指针”

 

三.Virtual Member Functions(虚拟成员函数)

      为了支持virtual function 机制,必须首先能够对于多态对象有某种形式的“执行期类型判断法(runtime type resolution)”

      ptr->z();

1.第一种方法,直接把必要的信息加在ptr身上。这个指针含有相关信息:

(1)它所参考到的对象的地址(也就是当前它所含有的东西)。

(2)对象类型的某种编码,或是某个结构(内含某些信息,用以正确决议出z()函数实例)的地址。

这个方法带来两个问题。

 

问题6:怎么样识别一个class是否支持多态?

 

2.问题7:画出单一继承情况的virtual table的布局,并加以解释?

程序如下:

      class Point {

       public:

              virtual ~Point();

              virtual Point& mult(float)=0;

              float x() const { return _x; }

              virtual float y() const { return 0;}

              virtual float z() const { return 0;}

protected:

              Point (float x=0.0);

              float _x;

};

 

class Point2d : public Point{

public:

Point2d(float x=0.0, float y=0.0 )

              :Point ( x),_y(y){}

~Point2d();

Point2d& mult(float);

float y() const {return _y;}

protected:

       float _y;

};

 

class Point3d : public Point2d{

public:

Point3d(float x=0.0, float y=0.0 ,float z=0.0)

              :Point2d( x,y),_z(z){}

~Point3d();

Point3d& mult(float);

float z() const {return _z;}

protected:

       float _z;

};

 

3.问题8:画出多重继承情况的virtual table的布局,并加以解释。

程序如下:

Class Base1{
public:
    Base1();

virtual ~Bade1();

virtual void speakClearly();

virtual Base1 *clone() const;

protected:

float data_Base1;

};

 

Class Base2{
public:
    Base2();

virtual ~Bade2();

virtual void mumble();

virtual Base2 *clone() const;

protected:

float data_Base2;

};

 

class Derived:public Base1,public Base2{

public:

       Derived();

virtual ~Derived();

virtual Derived *clone() const;

protected:

       float data_Derived;

};

 

4.问题9:画出虚拟继承情况的virtual table布局

class Point2d : {

public:

Point2d(float x=0.0, float y=0.0 )

~Point2d();

virtual void mumble();

virtual float z();

protected:

       float _x, _y;

};

 

class Point3d : public virtual Point2d{

public:

Point3d(float x=0.0, float y=0.0 ,float z=0.0)

             

~Point3d();

float z() ;

protected:

       float _z;

};