C++继承後的建构函式与解构函式

来源:网络时间:2012-04-05 17:05:08

  若您继承了某个类别之後,当您在生成衍生类别的物件时若不指定参数,无参数的预设建构子会被执行,而基础类别的无参数预设建构子也会被执行,所以基於这种特性,通常预设建构子中会撰写一些通用的成员状态初始,例如设定一些预设值。

  如果继承之後,您要使用衍生类别生成物件,在生成物件时指定参数,并同时执行基底类别中的某个参数建构子,您可以使用 : 运算子

  例如:

  // Point2D类别

  class Point2D {

  public:

  Point2D() {

  _x = 0;

  _y = 0;

  }

  Point2D(int x, int y) : _x(x), _y(y) {

  }

  private:

  int _x;

  int _y;

  };

  // Point3D类别

  class Point3D : public Point2D { // 继承Point2D类别

  public:

  Point3D() {

  _z = 0;

  }

  // 建构函式,同时指定呼叫父类别建构函式

  Point3D(int x, int y, int z) : Point2D(x, y), _z(z) {

  }

  private:

  int _z; // 新增私用资料

  };

  如果您使用衍生类别生成物件,则建构函式的执行顺序会从基底类别的建构函式开始执行起,这是可以理解的,因为基底类别是衍生类别的基础,一些基础的参数或初始状态必须先完成,再来再完成衍生类别中的建构函式。

  而在物件被消灭时,解构函式的执行顺序则正好相反,是从衍生类别的解构函式开始执行,再来才是基础类别的建构函式,因为若基底类别的解构函式如果先执行,则衍生类别相依於基底类别的一些状态也会被解构(例如指标),则此时再行衍生类别的解构函式,将存在着相依问题而造成错误。

  

  下面这个简单的程式可以告诉您建构函式与解构函式,在继承之後的执行顺序:

  #include <ioStream> using namespace std; class Foo1 { public:

  Foo1() {

  cout << "Foo1建构函式" << endl;

  }

  ~Foo1()

  {

  cout << "Foo1解构函式" << endl;

  }

  };

  class Foo2 : public Foo1 { public:

  Foo2() {

  cout << "Foo2建构函式" << endl;

  }

  ~Foo2() {

  cout << "Foo2解构函式" << endl;

  }

  };

  int main()

  {

  Foo2 f;

  cout << endl;

  return 0;

  }

  执行结果:

  Foo1建构函式

  Foo2建构函式

  Foo2解构函式

  Foo1解构函式

  

文章内容来源于网络,不代表本站立场,若侵犯到您的权益,可联系我们删除。(本站为非盈利性质网站) 联系邮箱:9145908@qq.com
多特网友 2012-11-14 10:27:26 回复
有效的学到东西啦。
多特网友 2011-10-05 23:36:22 回复
术语太多了,不够通俗。
多特网友 2011-09-29 17:40:25 回复
不知道 太深奥了
多特网友 2011-09-11 15:59:22 回复
为什么不兼加视频讲学呢?这太深奥啦
billy163612 2011-08-14 15:00:40 回复
太深奥了,能搞成影音的就更好了!谢谢
多特网友 2011-05-29 08:30:05 回复
[img src=\"/images/1.gif\"] 看不懂
多特网友 2011-06-06 06:49:40 回复
[img src=\"/images/1.gif\"][img src=\"/images/1.gif\"]不懂
多特网友 2011-08-08 17:41:09 回复
不知道 太深奥了
315761958 2011-08-11 09:56:38 回复
太深奥了,楼主可以分享简单一些的吗?或搞成影音的!谢谢
billy163612 2011-08-14 15:00:40 回复
太深奥了,能搞成影音的就更好了!谢谢