1. 程式人生 > >C++繼承與多型(一)

C++繼承與多型(一)

一、繼承相關概念   1.繼承:繼承是面向物件複用的重要手段。通過繼承定義一個類,繼承是型別之間的關係建模,共享共有的東西,實現各自本質不同的東西。     2.成員訪問限定符與繼承的關係               繼承是一種複用手段,在繼承關係裡基類繼承派生類的成員,由此打到複用目的。        三種繼承關係下基類成員在派生類的訪問關係變化         總結:        1)基類的私有成員(private)在派生類中是不能被訪問的,如果一些積累成員不想被基類物件直接訪問,但需要在派生類中能訪問,就定義為保護成員。保護成員限定符是因繼承才出現的        2)public繼承是一個介面繼承,保持is-a原則,每個父類可用的成員變數子類也可以用,因為每個子類物件也都是一個父類物件。
       3)protect/private繼承是一個實現繼承,基類的部分成員並未完全成為子類介面的一部分,是has-a的原則,一般情況下使用共有繼承。        4)無論哪種繼承方式,在派生類內部都可以訪問基類的公有成員和保護成員,但是基類的私有成員存在但是在子類中不可見,不能訪問        5)使用關鍵字class預設繼承方式是private,使用struct時預設繼承方式是public        6)實際運用中一般使用public繼承。       3.繼承與轉換(賦值相容規則-public繼承)        1)子類物件可以賦值給父類物件(切片/切割)        2)父類物件不能賦值給子類物件
       3)父類的指標/引用可以指向子類物件        4)子類的指標/引用不可以指向父類物件(可強轉)        4.繼承體系中的作用域        1)在繼承中基類和派生類都有獨立的作用域。        2)子類和父類中有同名成員,子類成員將遮蔽父類對成員的直接訪問。        隱藏/重定義:子類中定義了和父類同名的成員。        可以呼叫父類成員用作用域解析符來訪問父類成員。        3)注意在實際中最好不要定義同名成員。 二、派生類的預設成員函式         1.建構函式        合成建構函式:派生類只初始化自己的成員,父類部分呼叫父類的建構函式進行初始化。
Student(const char*name,int num)
  :Person(name)//呼叫父類建構函式
  ,_num(num)
{}
2.拷貝建構函式 //s2(s1)
Student(const Student& s)
  :Person(s)
  ,_num(s._num)
{}
3.值操作符過載 //s2=s1
Student& operator=(const Student& s)
{
   if(this!=&s)
   {
      Person::operator=(s);
      _num=s._num;
   }
   return *this;
}

4.解構函式        不需要顯式調父類,父類的解構函式是子類解構函式完成後自動呼叫的。 三、單繼承和多繼承        1.單繼承:一個子類只有一個直接父類        2.多繼承:一個子類有兩個或兩個以上直接父類                菱形繼承                菱形繼承會存在二義性和資料冗餘的問題
//解決二義性,沒有解決資料冗餘
Assistant a;
a.Student::_name="wo"
a.Teacher::_name="ni"
       虛繼承:解決菱形繼承的二義性和資料冗餘的問題        

相關推薦

C++繼承

一、繼承相關概念   1.繼承:繼承是面向物件複用的重要手段。通過繼承定義一個類,繼承是型別之間的關係建模,共享共有的東西,實現各自本質不同的東西。     2.成員訪問限定符與繼承的關係    

c++知識歸納】繼承

        c++是基於面向物件的程式語言,面向物件的三大特性為:封裝、繼承和多型。本文對繼承與多型的知識點進行了總結歸納,這部分內容對於學習c++程式語言是非常重要的,文章加入我的個人理解,希望

從零開始學C++之虛擬函式:虛擬函式表指標、虛解構函式、object slicing虛擬函式、C++物件模型圖

#include <iostream>using namespace std;class CObject {public:     virtual void Serialize()     {         cout << "CObject::Serialize ..." <&

c/c++ 繼承 文字查詢的小例子智慧指標版本

為了更好的理解繼承和多型,做一個文字查詢的小例子。 介面類:Query有2個方法。 eval:查詢,返回查詢結果類QueryResult rep:得到要查詢的文字 客戶端程式的使用方法: //查詢包含Daddy的文字所在的行 Query q("Daddy"); //查詢不包含Alice的

c/c++ 繼承 文字查詢的小例子非智慧指標版本

問題:在上一篇繼承與多型 文字查詢的小例子(智慧指標版本)在Query類裡使用的是智慧指標,只把智慧指標換成普通的指標,並不新增拷貝構造方法,會發生什麼呢? 執行時,程式碼崩掉。 分析下面一行程式碼: Query qb = ~Query("Alice"); 1,首先呼叫Query(string)的建構

C語言面向物件程式設計:虛擬函式3

 在《 C++ 程式設計思想》一書中對虛擬函式的實現機制有詳細的描述,一般的編譯器通過虛擬函式表,在編譯時插入一段隱藏的程式碼,儲存型別資訊和虛擬函式地址,而在呼叫時,這段隱藏的程式碼可以找到和實際物件一致的虛擬函式實現。     我們在這裡提供

《Java從入門到失業》第五章:繼承5.1-5.7繼承

5.繼承與多型 5.1為什麼要繼承        最近我兒子迷上了一款吃雞遊戲《香腸派對》,無奈給他買了許多玩具槍,我數了下,有一把狙擊槍AWM,一把步槍AK47,一把重機槍加特林(Gatling)。假如我們把這些玩具槍抽象成類,類圖的示意圖大致如下

《Java從入門到失業》第五章:繼承5.8-5.10Object類

5.8多型      上面我們瞭解了向上轉型,即一個物件變數可以引用本類及子類的物件例項,這種現象稱為多型(polymorphism)。多型究竟有什麼用呢?我們先學習一個知識點。 5.8.1方法重寫       

Java

多型時為了提高程式碼複用率和可讀性存在的, 簡單點說,就是同一個方法可以呼叫同一個父類的不同子類的功能,這樣就避免了到每一個子類中去寫這種相同的方法,具體實現見如下程式碼片段: Person.java package shunli.li.duotai; public class Per

Java程式設計師從笨鳥到菜鳥之面向物件之封裝,繼承

五:再談繼承   繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。物件的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那裡繼承方法和例項變數,並且類可以修改或增加

c/c++ 繼承 引用有的時候並不能達到的效果

繼承與多型 引用有的時候並不能達到多型的效果 問題:c++ primer 第五版說,只有指標和引用呼叫虛擬函式時才會發生動態繫結(多型)。實踐一下,發現引用有的時候不能發生多型繫結(多型)。 下面的例子,父類是Quote,在Quote裡定義了一個虛擬函式debug,用來打印出各自成員的值。2個子類Bulk

c/c++ 繼承 繼承中的public, protected, private

問題:類B私有繼承類A,類A有個protected成員,那麼在類B的成員函式裡是否可以使用類A的protected成員? 可以使用。 估計有的同學說不對吧,類B都私有繼承了類A了,怎麼還能訪問類A的protect成員呢?請看下面的例子。在類Pri_derv的f()成員函式裡是可以方位父類Base的pub_

c/c++ 繼承 靜態呼叫動態呼叫

靜態呼叫,與動態呼叫。 #include <iostream> class Base{ public: virtual int fcn(){ std::cout << "base fcn()" << std::endl; } }; class D1 :

深入瞭解.NET中繼承

很久都沒寫BLGO了,關於多型的第3篇文章一晃就1年了才寫。有時比較迷茫,感覺太多東西都要學,什麼都想學,卻找不清方向了。呵呵,看著好多牛人的BLOG覺得自己水平實在是太差了。呵呵。有時甚至覺得自己寫的東西太低階了。呵呵,或許是自己抱怨太多了,還是靜下心來慢慢學習吧。以後一

深入理解C#中的泛

為什麼要有泛型?   請大家思考一個問題:由你來實現一個最簡單的氣泡排序演算法,如果沒有使用泛型的經驗,可能會毫不猶豫的寫出以下程式碼: public class SortHelper { //引數為int陣列的氣泡排序 publi

[學習筆記]C#繼承

語言表達要清晰,結構明確。 繼承:一個類多用,減少程式碼量,且將框架層次化。(和JAVA幾乎一樣,比較簡單) class 基類 { 建構函式(a,b){} property1; methode() {} } class 派生

java之 ------ 類的封裝、繼承

問題:宣告銀行賬戶類,成員變數包括賬號、儲戶姓名、開啟時間、身份證號碼、存款餘額等賬戶資訊,成員方法包括開戶、存款、取款、查詢(餘額、明細)、銷戶等操作。 主要成員描述如下 public class Account { //

C++設計模式-繼承影響耦合性最基礎的簡單工廠模式小例項

繼承與多型影響耦合性(最基礎的簡單工廠模式小例項) 原理: 通過繼承和虛擬函式的方式修改某個子類對應函式的功能; 通過簡單工廠模式到底例項化誰; 如果要增加複雜的運算只有增加響應的子類,以及工廠的分支即可;   程式執行截圖如下:   目錄結構如

Java面向物件執行緒綜合實驗之封裝、繼承

編寫一個程式,實現檔案管理系統中的使用者管理模組。要求模組中實現使用者的模擬登入過程。通過使用者輸入,獲取使用者名稱和口令;與事先記錄在程式中的使用者資訊進行對比,通過口令驗證後才能使用系統。使用者分為系統管理人員、檔案錄入人員,檔案瀏覽人員三類,相關類圖如下所示。 (1)要求在使用者類中

C++: 繼承()三種繼承方式許可權

繼承 在C++中,我們常要對某個函式進行多次複用,例如: 資訊管理系統中,對於教師、學生、教務人員等"類"而言,有部分資訊是通用的:姓名,性別,年齡,聯絡方式等。如果為每一種角色都編寫一個"類",會有不少重複的程式碼,造成效率上的浪費。       &nbs