按此前往C++完整教學目錄

 

 

純虛擬函式(pure virtual function)抽象類別(abstract class)

類別之中,可以定義純虛擬函式,純虛擬函式就是沒有函式內容的函式。方法為:

virtual 回傳資料型別 函式名稱() = 0;

只要一個類別中至少有一個純虛擬函式,那麼這個類別就被稱為抽象類別。一個抽象類別無法產生物件,只能用來被繼承。如:

class A

{

   public:

   int a;

   A(int a_){a=a_;}

   virtual int func_test() =0  ;   // func_test是純虛擬函式

};

A A1;           //這行是錯誤示範,因A是抽象類別,故無法定義物件。

註:C++規定,繼承抽象基礎類別的衍生類別,一定要將抽象基礎類別中的純虛擬函式給實做(implement)。如:

class A

{

public:

int a;

A(){}

A(int a_){a=a_;}

virtual int func_test() =0  ;   //純虛擬函式

};

class B :public A  //B繼承A

{    

public:

int func_test(){cout<<"test success!!";}  //在此,將純虛擬函式給實做

int b;

};

 

B B1;   //如果沒有將純虛擬函式給實做,這一行會出現錯誤。

B1.func_test();   //顯示test success!!

 

 

上一篇:類別(class) 衍生類別物件的複製

下一篇:類別(class) 嵌入

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

按此前往C++完整教學目錄

 

 

衍生類別物件可以複製給基礎類別物件。這樣一來,衍生類別繼承自基礎類別的成員會被複製過去,

不過在衍生類別中另外定義的成員則不會複製。如:

class A

{

       public:

    int a;

    private:

    int xx;

};

 

class B:public A  //類別B 繼承類別A

{  

    public:

    int b;

};

 

A A1;

B B1;

B1.a=10;

A1=B1;          //類別B的物件B1,複製給類別A的物件A1

cout<<A1.a;      //顯示10

cout<<A1.b;     //這一行是錯誤示範。b是衍生類別物件B1自定的成員,不會被複製到基礎類別物件A1內。

B1=A1;         //這一行是錯誤示範。基礎類別物件無法複製給衍生類別物件。因基礎類別物件裡沒有衍生類別物件自定的成員。

註:以上的複製方法,稱為「切割(sliding)」。也就是把衍生類別物件自定的成員給刪除,再複製給基礎類別物件。

 

 

上一篇:類別(class) 多重繼承

下一篇:類別(class) 抽象類別

文章標籤

埃伯 發表在 痞客邦 留言(1) 人氣()

按此前往C++完整教學目錄

 

 

多重繼承虛擬基礎類別

(a) 一個類別可以被許多不同類別繼承,而一個類別也可以繼承許多不同類別(這稱為多重繼承),如:

class A{//類別內容};

class B{//類別內容};

class C : public A, public B{//類別內容};  //類別C繼承了類別A,也繼承了類別B

做圖為:

ss

 

 

(b) 若有一種繼承形態為:

image

乍看之下,程式碼似乎應該是:

class A{//類別內容};

class B : public A{//類別內容};

class C : public A{//類別內容};

class D : public B, public C{//類別內容};

但這種繼承形態之下,類別D繼承了類別A兩次。事實上,為避免資料重複存取造成系統資源浪費或出錯,正確的程式碼應該是:

class A{//類別內容};

class B : virtual public A{//類別內容};  //利用virtual關鍵字B類別設成相對於D虛擬基礎類別

class C : virtual public A{//類別內容};  //利用virtual關鍵字C類別設成相對於D虛擬基礎類別

class D : public B, public C{//類別內容};

 

 

上一篇:類別(class) 衍生類別的建構式

下一篇:類別(class) 衍生類別物件的複製

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

按此前往C++完整教學目錄

 

 

衍生類別的建構式寫法:

設:

class A

{

protected:

int  x1;

public:

A(int  x1_){x1=x1_;}        //(1). 基礎類別的建構式寫

};

 

class B : public A

{

protected:

int  x2;

public:

B(int x1_,int x2_):A(x1_){x2=x2_;}  //(2). 衍生類別建構式寫

};

 

class C : public B

{

protected:

string x3;

public:

C(int x1_,int x2_,string x3_):B(x1_,x2_){x3=x3_;} // (3). 二階衍生類別建構式寫法

};

 

C ctest(5,5,"5");  //建構C類別物件ctest

註:承上,在建構ctest物件時,建構式執行的順序是:(3)à(2)à(1)à(2)à(3)。以此推之,執行階數越高的衍生類別的建構式,系統所耗費的執行是越多的。

 

上一篇:類別(class) 繼承

下一篇:類別(class) 多重繼承

文章標籤

埃伯 發表在 痞客邦 留言(0) 人氣()

按此前往C++完整教學目錄

 

 

若在寫程式時,需定義多個類別(比如類別A、B、C、D、E),而類別B、C、D、E擁有類別A的某些成員、或某些成員函式,

若在定義類別B、C、D、E都把這些成員、成員函式定義進去,會浪費程式碼空間。因此,此時就可以使用繼承(inherit )的方法。

說明如下:

B類別繼承(inherit )A類別,則稱A類別為基礎類別B類別為衍生類別。做圖為:

ss

衍生類別B因為繼承了基礎類別A,故擁有基礎類別A的某些類別成員。

繼承的程式碼為:

class A{//類別內容};

class B : 繼承方法 A{}; 

以上的繼承方法可以是publicprotectedprivate。說明如下:

繼承(inheritance)的方式有三種:

公共繼承,如下程式碼(最常用的繼承方法)

class B: public A{ //類別內容 };

表示衍生類別(B)可以存取基礎類別(A) 放在public, protected區域的資料。

且衍生類別(B)把基礎類別(A) 放在protected區域的資料放在自己(B)protected區域,把基礎類別(A) 放在public區域的資料放在自己(B)public區域。

保護繼承,如下程式碼:

class B: protected A{ //類別內容 };

表示衍生類別(B)可以存取基礎類別(A) 放在public, protected區域的資料。

且衍生類別(B)把基礎類別(A) 放在public, protected區域的資料放在自己(B)protected區域。

 

私有繼承,如下程式碼:

class B: private A{ //類別內容 };

表示衍生類別(B)可以存取基礎類別(A) 放在public, protected區域的資料。

且衍生類別(B)把基礎類別(A) 放在public, protected區域的資料放在自己(B)private區域。

 

範例如:

class person

{

public:

int age;

string name;

public:

person(int age_, string name_)

{age=age_; name=name_;}        

};

 

class teacher : public person

{

public:

int salary;

public:

teacher (int age_, string name_, int salary_): person(int age_, string name_)

{ salary = salary _; }        

};

 

class student : public person

{

public:

int score;

public:

student(int age_, string name_, int score_): person(int age_, string name_)

{ score = score_; }        

};

 

上例之中,teacher類別和student類別都繼承person類別。

 

2.  

基礎類別衍生類別是相對關係。相對一類別而言,其「衍層類別」指的是「n階衍生類別(n可以為任意正整數)」;其「基層類別」指的是「n階基礎類別(n可以為任意正整數)」。

若一函數的輸入參數列中,有一參數其資料型態為類別A的物件,則在呼叫函數時,此參數可以輸入任何A類別物件以及A衍層類別物件。如:

class A

{

public:

A(int a_){a=a_;}

int a;

};

class B: public A  //BA的一階衍生類別,因此也是A的衍層類別

public:

B(int a_,int b_):A(a_){a=a_;b=b_;}

private:

int b;

};

class C

{

public:

void print_a(A A1){cout<<A1.a<<endl;};  //此函數的參數是A類別物件

};

A A1(5);

B B1(10,60);

C C1;

C1.print_a(A1);  //此函數的參數可以輸入A類別物件。在此顯示5

C1.print_a(B1);   //此函數的參數也可以輸入B類別物件。在此顯示10

 

 

上一篇:類別(class) friend的用法

下一篇:類別(class) 衍生類別的建構式

文章標籤

埃伯 發表在 痞客邦 留言(1) 人氣()