C 的類與物件 關於繼承與虛函式

2021-09-12 06:41:35 字數 2494 閱讀 6013

今天星期五,前兩天杭州天氣不錯,但是晚上又開始下雨了,之後的幾天也要下雨,真是令人難受。ok,這個星期主要複習了關於類的繼承相關知識。

1、繼承:c++允許程式設計師定義乙個基於舊類的新類,這個舊類叫做基類,新類叫做派生類。c++中類繼承的**如下:

class mat           //首先定義乙個基類

class mat2d: public mat //共有派生。

上面**建立了乙個叫mat的基類,mat2d類繼承自mat類,繼承方式為public。總共有三種繼承方式:public,protected,private,它們各有用處。需要記住的是,共有繼承的基類與派生類的關係應該是一種is_a的關係,例中我首先建立乙個矩陣(mat)類,然後建立乙個二維矩陣類mat2d並繼承mat類,很顯然,二維矩陣是一種矩陣,繼承應當被使用在這種關係中。

在上面共有派生的例子中,派生類物件儲存了基類的資料成員並且可以使用基類的方法。也在派生類中新增了建構函式並根據需要新增了若干成員資料(也可以新增自己的成員函式)。注意,派生類必須要有自己的建構函式。派生類不能直接訪問基類的私有成員,必須通過基類的方法來訪問,所以派生類建構函式必須使用基類建構函式來初始化基類的資料成員。在建立派生類實體的時候,程式會先建立基類物件,即基類物件應該在程式進入派生類建構函式之前被建立。在編碼過程中應該這樣實現:

mat2d::mat2d(/*引數列表*/):mat(/*引數列表*/)

在初始化列表中呼叫基類建構函式初始化基類資料成員,另外,還要記得在派生類的建構函式中初始化自己新增的資料成員。與建構函式對應,當物件過期時,程式將首先呼叫派生類的析構函式,然後呼叫基類的析構函式。

派生類與基類的關係:我們都知道,派生類可以呼叫基類非私有的成員函式,當然,還有兩個重要的關係:1、基類指標可以在不進行顯式型別轉換的情況下指向派生類物件;2、基類的應用也可以在不進行顯式型別轉換的情況下引用派生類。但是基類的指標或者引用只能呼叫基類的方法。這兩個關係使得基類引用定義的函式或指標可以用於基類物件或派生類物件。(派生類也可以賦值給基類物件)

關於protected:protected從類外來看,與private相似,類外只能訪問public,通過public訪問private與protected。但是在繼承時,派生類的成員可以直接訪問基類的保護成員。因此對於派生類而言,protected與public類似。

私有繼承:與公有繼承不同,私有繼承用於解決has-a的類間關係。在私有繼承中,基類的public和protected成員都將成為派生類的private成員。我們不能使用基類的方法作為派生類的公有介面,但是在派生類的成員函式中可以使用他們。

私有繼承的初始化與有關訪問:私有繼承的初始化應該在初始化列表中使用來表示。並且使用類名加作用於解析符來呼叫基類的方法。而對於訪問基類物件本身,我們知道,實際上string類在student類中是沒有名稱的,這時需要使用強制型別轉換,將student物件轉換為string物件,結果為繼承而來的string物件。

class student:private std::string   //私有繼承

student::student(const char* name):std::string(name) //使用類名來初始化

//訪問基類方法

int student::namelength()

//訪問基類的物件

const std::string& student::name() const

保護繼承:基類的public與protected成員成為派生類的protected成員。與私有繼承類似。

共有繼承的多型:這部分包含兩個內容:1、在派生類中重新定義基類的方法;2、使用虛方法。主要說一下虛函式相關。虛函式主要是用於基類和派生類公共介面的情況。當我基類和派生類有著相同的介面,但是其行為不一樣時,我們使用虛函式。使用時,在基類給予一般意義上的實現,派生類給與針對該派生類的特殊實現。當派生類不再定義該函式時,使用父類函式。也有純虛函式,即在基類中只給出宣告,不給出實現。包含純虛函式的類稱為純虛類,純虛類無法定義實體。

虛函式在一些情況下會有特殊的用處。之前我們提過,基類指標可以在不進行顯式型別轉換的情況下指向派生類物件,引用也可以。當基類指標或應用呼叫類方法時,虛函式與非虛函式就存在差異。當基類指標指向派生類物件時,指標呼叫類方法,對於非虛函式,指標呼叫的是基類的方法;但對於虛函式,指標會呼叫派生類的方法。從這一點來說,虛析構函式也是必要的。

具體宣告如下:

class a

int a::funa(); //虛函式的實現

class b:public a

int b::funa();

int b::funb();

注意事項:挑幾個重要的說。1、沒有重新定義:如果派生類沒有重新定義函式,則使用該函式的基類版本,如果派生類位於派生鏈中,則使用最新的虛函式版本。2、重新定義隱藏方法:如果派生類的虛函式與基類介面的引數不同,那麼這種情況不能做過載考慮,而是對基類函式的覆蓋。如果基類的虛函式宣告被過載了,應該在派生類中重新定義所有版本。

虛函式與繼承

學生類,派生出文科生類和理科生類,它們繼承了學生類的一些基本資訊如姓名 學號 性別,又有著自身的成員,比如說文科類有政治 歷史地理科目 理科類有化學 物理 生物科目。在錄入學生資訊時既要錄入他們的基本資訊,又要錄入他們各科的成績,所以就派生出文科類和理科類,同時對派生出來的類中的一些函式進行覆蓋 i...

C 中繼承與虛函式

一 類與類之間的關係 1 類與類之間可能會存在共性 2 類與類之間必定會有差異 3 為了節約開發時間和 量,我們在設計時可以把類的共項抽象出來形成乙個基礎類 基類 4 使用基類 差異生成乙個新的類叫派生類 二 繼承的語法 1 在設計乙個類時如果已有的類中有它需要的成員,它可以從已有的類中繼承哪些成員...

關於類繼承 與 物件布局

最近在複習c 看到csdn論壇上一道關於虛函式的問題,使得自己也去複習了相關東西,不是很深入,但對很多模糊的東西更加清晰,記錄一下 1 指向類成員的指標並非指標 c 必知必會15條 定義乙個類成員指標 int c pimc c val 代表的是 val在類c中的偏移量,可以通過程式列印出來看看.如果...