在c++
程式設計中軟體
可重用性(software reusability)是通過繼承
(inheritance)
機制來實現的。類的繼承,是新的類從已有類那裡得到已有的特性。或從已有類產生新類的過程就是類的派生。原有的類稱為基類或父類,產生的新類稱為派生類或子類。
派生類的宣告:
class 派生類名:[繼承方式
] 基類名
;乙個派生類可以同時有多個基類,這種情況稱為多重繼承,派生類只有乙個基類,稱為單繼承。
繼承方式規定了如何訪問基類繼承的成員。繼承方式有public, private, protected。繼承方式指定了派生類成員以及類外物件對於從基類繼承來的成員的訪問許可權。
繼承方式如下:
a、公有繼承
基類的公有成員和保護成員在派生類中保持原有訪問屬性,其私有成員仍為基類的私有成員。
b、私有繼承
基類的公有成員和保護成員在派生類中成了私有成員,其私有成員仍為基類的私有成員。
c、保護繼承
基類的公有成員和保護成員在派生類中成了保護成員,其私有成員仍為基類的私有成員。
#include using namespace std;class base;class drive:public base};//int main()
派生類中的成員,包含兩大部分,一類是從基類繼承過來的,一類是自己增加的成員。從基類繼承過過來的表現其共性,而新增的成員體現了其個性。
派生類中由基類繼承而來的成員的初始化工作還是由基類的建構函式完成,然後派生類中新增的成員在派生類的建構函式中初始化。所以派生類沒有繼承基類的建構函式和析構函式。
派生類的建構函式語法
派生類名::派生類名(引數總表)
:基類名(參數列),內嵌子物件(參數列)
graduate::graduate(string sn, int in, char cs, float fs)
:student(sn,in,cs),salary(fs)
建構函式的初始化順序並不以上面的順序進行,而是根據宣告的順序初始化。如果基類中沒有預設建構函式(無參),那麼在派生類的建構函式中必須顯示呼叫基類建構函式,以初始化基類成員。
u 派生類建構函式執行的次序:
基類-->成員-->子類
a、呼叫基類建構函式,呼叫順序按照它們被繼承時宣告的順序(從左到右);
b、呼叫內嵌成員物件的建構函式,呼叫順序按照它們在類中宣告的順序;
c、派生類的建構函式體中的內容。
祖父類student.hclass student;student.cppstudent::student(string sn, int n, char s):name(sn),num(n),***(s)student::~student()void student:: dis()
父類student.hclass student;student.cppstudent::student(string sn, int n, char s):name(sn),num(n),***(s)student::~student()void student:: dis()
基類student.hstudent & operator=(const student & another);student.cppstudent & student::operator=(const student & another) 派生類graduate.hgraduate & operator=(const graduate & another);graduate.cppgraduate & graduate::operator=(const graduate & another) 測試**int main();class drive:public base};//int main()
#include using namespace std;class base;class drive:public base;
private在子類中不可見,但仍可通過父類介面訪問。
public作用:傳承介面
,間接的傳承了資料(protected)。
protected作用:傳承資料,間接**了對外介面
private
作用:**了資料和介面
a、只要是私有成員到派生類中,均不可訪問。
正是體現的資料隱蔽性.其私有成員僅可被本類的成員函式訪問。b、
如果多級派生當中,均採用public
,直到最後一級,派生類中均可訪問基類的
public
,protected成員
。兼顧了資料的隱蔽性和介面傳承和資料傳遞
c、如果多級派生當中,均採用private
,直到最後一級,派生類中基類的所有成員均變為不可見。只兼顧了資料的隱蔽性
d、如果多級派生當中,
均採用protected
,直到最後一級,派生類的基類的所有成員即使可見,也均不可被類外呼叫。
多繼承的語法定義
派生類名::派生類名(引數總表)
:基類名 1(參數列
1),基類名(引數名 2)
....
基類名
n(引數名 n),
內嵌子物件 1(參數列
1),內嵌子物件
2(參數列 2)
....
內嵌子物件
n(參數列 n)
在多繼承中,儲存共同基類的多份同名成員,可以在不同的資料成員中分別存放不同的資料,但保留多份資料成員的拷貝,不僅占有較多的儲存空間,還增加了訪問的困難。
c++提供了虛基類和虛繼承機制,實現了在多繼承中只保留乙份共同成員。
虛繼承的語法
class 派生類名:virtual 繼承方式 基類名
sleepsofa類繼承自
bed和
sofa
兩個類,因此,
sleepsofa
類擁有這兩個類的特性
。建立乙個sleepsofa物件
時,會構造bed類和
sofa
類,但bed
類和sofa
類都有乙個父類,因此
furniture
類被構造了兩次,這是不合理的,
使用虛繼承後
furniture類就只會構造一次,
sleepsofa
物件只會包含乙個
furniture
物件。
#include #include using namespace std; class furniture furniture(double weight) : m_weight(weight){} ~furniture(void){} double getweight() const void setweight(double val) private: double m_weight;}; class bed : virtual public furniture bed(double weight, int second) : furniture(weight), m_second(second){} void sleep(int second) private: int m_second; };class sofa : virtual public furniture sofa(double weight) : furniture(weight){} void watchtv(string programme) }; class sleepsofa : public bed, public sofa sleepsofa(double weight, int second) : bed(weight, second), sofa(weight) {} void foldout() };int main(void)
在程式設計中最好不要出現多繼承,要有也是繼承多個作為介面使用抽象類(只宣告需要的功能,沒有具體的實現
)。因為出現一般的多繼承本身就是一種不好的物件導向程式設計。
C 繼承與派生
派生新類 吸收已有類的成員 調整已有類成員和新增新的成員 class 派生類名 繼承方式 基類名1,繼承方式 基類名2,派生類成員宣告 繼承方式有 public protected private 預設 公有繼承 基類的公有和保護乘員的訪問屬性在派生類中不變,基類的私有成員不能直接訪問 型別相容規則...
c 繼承與派生
繼承 與派生 一 派生方式的不同的表現 1 派生類在類內成員對基類成員 的訪問許可權 2 派生類的物件對基類成員的訪問許可權。二 公有繼承 1 基類protected和public的成員在派生類中訪問屬性保持不變 2 基類的private成員在派生類中不可訪問。3 派生類的成員 即派生類內 可以直接...
c 繼承與派生
一 基本概念 1 類的繼承,是新的類從已有類那裡得到已有的特性。或從已有類產生新類的過程就是類的派生。原有的類稱為基類或父類,產生的新類稱為派生類或子類。2 派生類的宣告 class 派生類名 繼承方式 基類名1,繼承方式 基類名2,繼承方式 基類名n 3 乙個派生類可以同時有多個基類,這種情況稱為...