類別樣板 class template

Post on 19-Jan-2016

43 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

類別樣板 Class Template. 類似函式樣板 由類別樣板產生的類別稱為類別樣版的實體 (instance) 此建立過程稱為 instantiating. template Class Cexample { T m_value; }. Class Cexample { int m_value; } Class Cexample { CBox m_value; }. Example. T 是一個變數用來設定型態 , 根據不同型態建立新類別. 定義類別樣板 p350. 說明. 參數 T 是變數型態 - PowerPoint PPT Presentation

TRANSCRIPT

類別樣板 Class Template

類似函式樣板 由類別樣板產生的類別稱為類別樣版的實

體 (instance) 此建立過程稱為 instantiating

Example

template <class T>

Class Cexample

{

T m_value;

}

Class Cexample

{

int m_value;

}

Class Cexample

{

CBox m_value;

}T 是一個變數用來設定型態 , 根據不同型態建立新類別

定義類別樣板 p350

說明 參數 T 是變數型態 宣到類別物件時 , T 會被指定的型態取代

樣版的成員函式 如何放在定義外 template <class T>

T Csamples<T>::Max() const

{

T theMax = m_Values[0];

for (int i=1; i<m_Free, i++)

if….

}

用來辨別函式屬於哪個樣版

所產生

建構子定義在類別樣板之外template<class T>

Csamples<T>::Csamples(T values[], int count)

{

m_Free = count < 100 ? Cpunt:100;

for(int i=0; i<m_Free; i++)

m_Values[i]=Values[i];

}

從類別樣板建立物件 Csamples <double> myData(10.0) Example 9_07.cpp

多個參數的類別樣板

template<class T1, class T2>

class Cexample

{

private:

T1 m_value1;

T2 m_Value2;

}

Chapter 10

類別繼承

目標 由已存在類別定義新的類別 類別成員存取屬性關鍵字 protected 夥伴類別 虛擬函式 純虛擬函式 抽象類別 虛擬建構子 多重繼承

類別 用來表示某種抽象事物 真實世界的物件的資料型態定義

Example p384

Box• Length, Breadth, Height

Carton, CandyBox, Crate, BeerCrate

類別繼承 衍生類別 (derived) 基礎類別 (base class) 類別以一個或多個類別為基礎來定義 衍生類別繼承 (inherit) 基礎類別的資料成

員和函式成員

類別繼承 (cont.) 解構子、建構子、覆載的指定運算子等不

會被繼承 衍生類別有自己的解構子及建構子

何為基礎類別 放在另一個類別定義中的類別 Ex: B 類別的定義中含 A 類別 A 是 B 的直接基礎類別 (direct base clas

s) Ex: p384

• CBox 是 CBeerCrate 的間接基礎類別 (indirect base class)

Figure p385

Example

class Cbox

{

public:

double m_Length;

double m_Breadth;

double m_Height;

Cbox(…..)

}

class CCandyBox: CBox{ public: char* m_Contents;

CCandyBox(char* str = "Candy") { m_Contents = new char[ strlen(str) + 1 ];

strcpy(m_Contents, str);}

~CCandyBox() { delete[] m_Contents; };

};

Ex10_01.cpp

說明 CBox:24bytes CCandyBox:32bytes 被繼承的基礎類別內定存取屬性 private class CCandyBox: private CBox class CCandyBox: public CBox 基礎類別一定要有存取屬性 , 用來決定被衍

生類別繼承後的成員存取狀態 若省略 , 則編譯器假設為 private

繼承下的存取控制 基礎類別的 private 資料成員也是衍生類

別的成員 在衍生類別中將維持 private 屬性 p389

存取基礎類別的 private 成員 Ex10_02.cppclass CBox{ public: CBox(double lv = 1.0, double bv = 1.0, double hv = 1.0): m_Length(lv), m_Breadth(bv), m_Height(hv){}

//Function to calculate the volume of a CBox object double Volume() const { return m_Length*m_Breadth*m_Height; }

private: double m_Length; double m_Breadth; double m_Height;};

衍生類別建構子的運作 建立衍生類別的基礎類別部份 , 會呼叫基

礎類別的建構子而非衍生類別的建構子 Ex10_03.cpp 從衍生類別的建構子去呼叫基礎類別的某

個建構子 , 即可利用基礎類別的建構子將衍生類別的資料成員初始化

或用衍生類別建構子的資料去改變基礎類別建構子的內容

呼叫基礎類別的建構子class CCandyBox: public CBox{ public: char* m_Contents;

// Constructor to set dimensions and contents // with explicit call of CBox constructor CCandyBox(double lv, double bv, double hv, char* str= "Candy") :CBox(lv, bv, hv) { cout << endl <<"CCandyBox constructor2 called"; m_Contents = new char[ strlen(str) + 1 ]; strcpy(m_Contents, str); }

// Constructor to set contents // calls default CBox constructor automatically CCandyBox(char* str= "Candy") { cout << endl << "CCandyBox constructor1 called"; m_Contents = new char[ strlen(str) + 1 ]; strcpy(m_Contents, str); }

~CCandyBox() // Destructor { delete[] m_Contents; }};

top related