Welcome

首页 / 软件开发 / C++ / 《深度探索C++对象模型》读书笔记(5)

《深度探索C++对象模型》读书笔记(5)2010-01-05 blog.csdn.net arthurkingios***纯虚拟函数***

在设计抽象基类时,需要注意以下几点:

(1)不要将destructor 声明为pure virtual function;

如果将destructor声明为pure virtual function,则设计者一 定得定义它。因为每一个derived class destructor会被编译器加以扩展,以静态调用得方式调用其 “每一个virtual base class”以及“上一层base class”的 destructor.

(2)不要将那些函数定义内容并不与类型有关的函数设计为virtual function,因 为其几乎不会被后继的derived class改写。

(3)对于其derived class可能修改某一个data member的函数,不应被声明为const.

***“无继承”情况下的对象构造***

先 定义class Point:

class Point {
public:
Point(float x = 0.0, float y = 0.0) : _x(x),_y(y) {}
virtual float z();
protected:
float _x,_y;
};

你可不能小看z()这个virtual function给class Point带来的巨大变化。virtual function的引入促使每一个class Point拥有一个vtpr,这样一来,编译器在constructor中添加了对 vptr进行初始化的代码,而copy constructor和copy assignment operator也会对vptr进行设定,而不 再是原先简单的bitwise操作了。

请看以下的代码:

Point foobar()
{
Point local;
Point *heap = new Point;
*heap = local;
delete heap;
return local;
}

将被内部转化为:

Point foobar(Point &_result)
{
Point local;
local.Point::Point();
Point *heap = _new (sizeof(Point));
if(heap != 0)
heap->Point::Point();
*heap = local;
_result.Point::Point(local); // copy constructor的应用
local.Point::~Point();
return;
}

从以上代码的转化可以看出:一般而言,如果你的设计之中有很多函 数都需要以传值方式(by value)传回一个local class object,那么提供一个copy constructor就比 较合理。

***继承体系下的对象构造***

假设class Point3d虚拟继承于class Point,但 由于class Point仅存在一份实体,因而class Point3d的constructor需要注意一个问题。

请看下面的继承关系图:

class Point3d : virtual public Point { ... };
class Vertex : virtual public Point { ... };
class Vertex3d : public Point3d, public Vertex { ... };