《深度摸索C++对象模子》读书笔记(5)[VC/C++编程]
本文“《深度摸索C++对象模子》读书笔记(5)[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
***纯虚拟函数***
在计划抽象基类时,需求注意以下几点:
(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 { ... };
以上是“《深度摸索C++对象模子》读书笔记(5)[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |