c 筆記(8) 類的繼承 成員的重名 多繼承

2021-07-24 23:19:19 字數 4701 閱讀 4649

1.

類之間的關係:

has-a:包含關係,用以描述乙個類由多個「部件類」構成。實現has-a關係用成員表示,即乙個類中的資料成員是另一種已經定義的類。

uses-a:乙個類部分地使用另乙個類。通過類之間成員函式的相互聯絡,定義友元或物件引數傳遞實現。

is-a:機制稱為「繼承」。關係具有傳遞性,不具有對稱性。 

繼承是類之間定義的一種重要關係,乙個 b 類繼承a類,或稱從類 a 派生類 b,類 a 稱為基類(父類),類 b 稱為派生類(子類)

類繼承關係的語法形式:

class 派生類名 : 基類名錶

;基類名錶的構成:訪問控制  基類名1, 訪問控制  基類名2 ,… , 訪問控制  基類名n

公有繼承:基類的公有成員是派生類的公有成員,基類的保護成員是派生類的保護成員

私有繼承:基類的公有成員和保護成員是派生類的私有成員

保護繼承:基類的公有成員和保護成員是派生類的保護成員

不論何種方式繼承基類,派生類都不能直接使用基類的私有成員 

2.

公有繼承:

#includeusing namespace std ;

class a

void put_xy()

protected: int x, y ;//保護資料成員在類層次中可見

};class b : public a

; void make_s() ; // 使用基類資料成員x,y

protected: int s;//保護資料成員在類層次中可見

};class c : public b

int get_v()

void make_v() // 使用基類成員函式

protected: int h, v;//保護資料成員在類層次中可見

};int main()

3.

私有繼承:

#includeusing namespace std ;

class a

void put_xy()

protected: int x, y ;

};class b : private a

void make_s() //呼叫基類成員函式,訪問私有資料成員

private: int s ;

};int main()

4.

私有資料成員的測試:

#includeusing namespace std ;

class a

int out()

void addx()

private: int x ;//基類的私有資料成員不能在派生類中直接訪問,但派生類物件會建立私有資料空間

} ;class b : public a

int out()

void addy()

private: int y ;

} ;int main()

5.

重名成員

派生類定義了與基類同名的成員,在派生類中訪問同名成員時遮蔽了基類的同名成員

在派生類中使用基類的同名成員,顯式地使用類名限定符:類名 :: 成員 

基類成員的作用域延伸到所有派生類,派生類的重名成員遮蔽基類的同名成員

#includeusing namespace std ;

class a

void print()

};class b : public a

void print() //定義同名函式

void printab()

};int main()

派生類也是基類,基類指標可以指向派生類物件

派生類中定義與基類同名的成員函式,稱為過載成員函式

6.

派生類中訪問靜態成員:

基類定義的靜態成員,將被所有派生類共享

派生類中訪問靜態成員,用以下形式顯式說明:類名 :: 成員  或    物件名 . 成員

#includeusing namespace std ;

class b

static int i;

void out()

int inc1 ()

int inc2 ()

void display ()

};class derived_class : private parent_class

int inc1 ( )

int inc3 ( )

void display ( )

} ;int main ( )

8.

類繼承和類包含的比較:

//用繼承方式設計point類和circle類 

#includeusing namespace std ;

class point

void outpoint()

protected : double x, y;

};class circle : public point //circle類繼承point類

void outcircle()

protected: double radius; //派生類資料成員

};int main()

//用包含方式設計point類和circle類

#includeusing namespace std ;

class point

void outpoint()

protected : double x, y;

};class circle

void outcircle()

point centre; //包含point成員

protected: double radius;

};int main()

9.

多繼承:

乙個類有多個直接基類的繼承關係稱為多繼承,多繼承宣告語法:

class  派生類名 : 訪問控制  基類名1 ,  訪問控制  基類名2 ,  … , 訪問控制  基類名n

;多個基類的派生類建構函式可以用初始式呼叫基類建構函式初始化資料成員。

執行順序與單繼承建構函式情況類似。多個直接基類建構函式執行順序取決於定義派生類時指定的各個繼承基類的順序。

class base1

int getdata() const

protected:

int value;

};class base2

char getdata() const

protected:

char letter;

};class derived : public base1, public base2

;int main()

10.

虛繼承:

如果乙個派生類從多個基類派生,而這些基類又有乙個共同的基類,則在對該基類中宣告的名字進行訪問時,可能產生二義性。

如果在多條繼承路徑上有乙個公共的基類,那麼在繼承路徑的某處匯合點,這個公共基類就會在派生類的物件中產生多個基類子物件。

要使這個公共基類在派生類中只產生乙個子物件,必須對這個基類宣告為虛繼承,使這個基類成為虛基類。

虛繼承宣告使用關鍵字:    virtual

class  b   ;

class  b1 : virtual  public  b ;

class  b2 : virtual  public  b ;

class  c : public  b1 , public  b2 

;由於類 c 的物件中只有乙個 b 類子物件,名字  b 被約束到該子物件上,所以,當以不同路徑使用名字 b 訪問 b 類的子物件時,所訪問的都是那個唯一的基類子物件。即

cc . b1 :: b   和   cc . b2 :: b   引用是同乙個基類 b 的子物件

#includeusing namespace std ;

class a

} ;class b : public a

} ;class c : public a

} ;class d : public b , public c

} ;int main ( )

//一次呼叫a的建構函式abcd

#includeusing namespace std ;

class a

} ;class b : public a

} ;class c : public a

} ;class d : public b , public c

} ;int main ( )

//兩次呼叫a的建構函式abacd

類的繼承 多繼承

多繼承要注意很多地方,以下 只是最基本多繼承方式,下面會講到多繼承的基本格式和繼承方法 簡單說明 1 如果在子類中需要父類的構造方法就需要顯示的呼叫父類的構造方法,或者不重寫父類的構造方法。2 在呼叫基類的方法時,需要加上基類的類名字首,且需要帶上 self 引數變數。區別在於類中呼叫普通函式時並不...

python怎麼繼承類 python類的繼承

一 概述 二 類的繼承 2.1 繼承的定義 2.2 建構函式的繼承 2.3 子類對父類方法的重寫 三 類繼承的事例 一 概述 物件導向程式設計 oop 語言的乙個主要功能就是 繼承 繼承是指這樣一種能力 它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。通過繼承建立...

Java筆記 內部成員類的繼承

檔案一 package tmp public class innerclass test public void set name string name public class innerclass public void printinf 檔案二 package tmp public clas...