读书日记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;
};