2008年8月13日 星期三

c++ - 繼承


#include "Point2D.h"

class Point3D : public Point2D {
  public:
    Point3D() {
    _z = 0;
    }
    Point3D(int x, int y, int z) : Point2D(x, y), _z(z) {
    }
    int z() {return _z;}
    void z(int z) {_z = z;}

    private:
    int _z;
};

其中Point3D(int x, int y, int z)的部分
後面的Point2D(int x,int y)是指父類別Point2D的建構子,會把x,y代入父類別的建構子
而我想_z應該是int _z這一個的建構子,這個時候把它看成一個物件,並且它不能是指標
反正建構子後面接的就是建構子,而它剛好有一個特例就是把_z當成一個物件這樣(應該吧)~

[2008.11.28 補充]
在建構函式的初始化設定語法中,以上說的就是成員初始化列表(Member initialization list)

#include "SafeArray.h"

SafeArray::SafeArray(int len) : length(len),int_variable(2) {
  _array = new int[length];
}

...略

要被初始化的成員跟在參數列之後,要被設定給成員的引數被放在括號中,如果有多個成員要初始化,則以逗號分隔。

而衍生類別的無參數的建構子會直接呼叫父類別的無參數建構子,不需要另外定義它

關於解構函式還有一個問題,如果沒有定義解構函式時,程式如何結束物件?答案是程式會自動建立一個沒有實作內容的解構函式並自動於適當的時機執行。

[2008.12.4 補充]
父類別建構子與子類別建構子之間的關係
用以下的例子來說明
main.cpp

#include <iostream>
using namespace std;

class father{
  public:
    father(){ // 建構子
      cout << "I am the father" << endl;
    }

    father(int x){
      cout << "I am the other father" << endl;
    }
};

class son:public father{
  public:
    son(){ // 若沒有指定預設是在執行此建構子前,先執行父類別的沒有參數的建構子
      cout << "I am the son" << endl;
    }

    son(int x) : father(x){ // 在執行此建構子前,會先執行父類別的father(int)的這一個建構子
      cout << "I am the other son" << endl;
    }

    son(int x,int y){ // 若沒有指定預設是在執行此建構子前,先執行父類別的沒有參數的建構子
      cout << "I am the super son" << endl;
    }
};

int main(int argc, char *argv[]){
  cout << "==========================" << endl;
  son *good1 = new son();
  cout << "==========================" << endl;
  son *good2 = new son(1);
  cout << "==========================" << endl;
  son *good3 = new son(1,1);
  cout << "==========================" << endl;
  return 0;
}


參考資料:C++ Gossip: 公開(public)繼承

沒有留言: