包。繼承,多型性c++的三個基本概念,在這裡,我們重點總結繼承的東西
1 類派生列表
類派生列表中指定乙個派生類繼承基類,來自列表與乙個或多個基類如:
class b : public a1,protected a2,private a3
可是單繼承時最常見的,多繼承不多見
2 派生類的定義
派生類繼承時,會包括父類的全部成員。即便私有成員不能被訪問。父類中的虛函式,在派生類中一般也要定義,如
果不定義的話。派生類將繼承基類的虛函式
3 基類必須是已經定義的
乙個只宣告的類,是不能出如今派生類的類派生列表中。因此派生類非常可能要訪問基類的列表,可是假設基類還沒
被定義,所以這樣做是錯誤的。
4 派生類的宣告
派生類的列表不能出如今派生類的列表中,如:
class b : public a; //error
正確的宣告應是:
class b;
class a;
5 繼承修飾符
c++中的繼承方式有三種。public。protected,private繼承(簡稱3p)。
無論是何種繼承方式,基類中的private成員
都不能被派生的使用者**和成員定義**訪問。接下來詳細說說三種繼承方式:
<1>private繼承,基類的全部成員在派生類中都是private成員,可是基類的private成員依然不能被訪問
<2>protected繼承,基類的public,protected成員變成子類的protected成員,基類的private成員依然不能被訪問
<3>public繼承,基類的public變成派生類的public。protected變成派生類的protected。基類的private不能被訪問
6 protected 修飾符
當protected修飾類成員的時候,類成員能夠被類自身成員定義所使用。可是不能被使用者**使用,這點類似private
其次,protected修飾的成員能夠被子類訪問到。這點類似public,可是不用於private。
7 不能被繼承的成員
建構函式,複製控制成員(複製建構函式,賦值操作符,析構函式)這是不能被繼承的函式
8 派生類的建構函式
派生類建構函式一般格式:
deriveclass(***):baseclass(***),x1(x),x2(x)....
<1> 派生類的建構函式除了要初始化自己新定義的成員外,還要初始化基類的成員。順序是先呼叫基類的建構函式初始化基類的成員。然後再初始化自己的新成員(順序是宣告的順序)
<2> 假設沒有自定義建構函式。編譯器會合成乙個預設的建構函式,先呼叫基類的預設建構函式,然後就再去初始化其它新的成員。
<3> 這裡須要注意的是:假設基類沒有預設建構函式。那麼編譯器就不能合成預設建構函式,假設這個時候再不去定義派生類的預設建構函式,那樣就會出錯。諸如--「error c2512: 「derive」: 沒有合適的預設建構函式可用。」
<4> 假設不在派生類建構函式的初始化列表中指定基類的建構函式,則會呼叫基類的預設建構函式
<5> 派生類建構函式的預設實參派生類能夠將建構函式的全部引數都設定為預設引數,能夠使用0-n個預設引數
9 派生類中的複製控制
複製控制包含複製建構函式,賦值操作符。析構函式
<1>未定義複製建構函式。編譯器會自己合成乙個複製建構函式,它會呼叫基類的複製建構函式
<2>自己定義複製建構函式,一般要呼叫基類的複製建構函式,否則會出意外
<3>未定義賦值操作符。編譯會自己主動合成乙個賦值操作符,它會呼叫基類的複製操作符
<4>自己定義賦值操作符要提防自身賦值。一般都是這麼做
derive& derived::operator =(derived& rh)
}
這樣做的原因就是為了防止自身賦值。在自身賦值的時候。我們通常要先把動態開闢的記憶體clear掉。假設不加上if(this != &rh)的話。那麼在進行自身賦值的時候,就會把自己給廢了(clear掉自己)。
<5> 派生類析構函式
這個和前兩個不同,派生類的析構函式僅僅負責自己新定義物件的析構,不負責基類物件的析構。在派生類物件析構的時候,編譯器會先呼叫派生類自己的析構函式,然後呼叫基類的析構函式。
每乙個類無論基類還是派生類,都僅僅負責清除自己的成員。
以上的複製控制演示樣例**例如以下所看到的:
#pragma once
#include using namespace std;
class base;}
class b : public a
;private int x;
}b b;
b.fun(11); //ok
b.func(); //error
11 using
能夠在派生類中使用using來改變繼承自基類中的成員的級別。前提是派生類對基類的成員具有訪問許可權。
#pragma once
#include using namespace std;
class base
;~base(void){};
size_t size()const
protected:
//private:
size_t n;
int fn(int x);
int fn()
};
#pragma once
#include "base.h"
class derived :
private base
;~derived(void){};
using base::size;
using base::fn;
};
#include "base.h"
#include "derived.h"
#include using namespace std;
void main()
{derived xx;
base yy;
cout《真可可謂一次宣告,多個使用。
12 friend 跟繼承的關係
友元跟繼承沒有關係。基類的派生類不能被基類的派生類訪問。
友元類的派生類對基類沒有訪問許可權。
13 引用轉換,轉換物件
引用轉換:派生類物件轉換為基類型別的引用
轉換物件:用派生類物件轉換為基類的物件。這個時候形參是固定的。編譯和執行時候的物件都是基類型別物件。派生類的基類部分被拷貝到形參中。
引用轉換:派生類物件轉換為基類的引用。可是假設賦值的話也是把派生類的基類部分賦值給基類物件。這和指標的切片效應乙個道理。
14 基類和派生類的轉換
派生類轉物件賦給基類也是有條件才幹行的,這個條件就是派生類是通過public來繼承的。這種話不論是在成員**還是在使用者**中。都能實現
derived d;
base b = d;
假設是通過protected繼承的,那麼僅僅能在成員定義中使用這種**。
15 預設的繼承標準
類和結構在預設繼承指引相反。
<1>當類繼承,假設沒有預選賽,那麼預設為private繼承。如果沒有預選賽時的結構,它是預設public繼承。
<2>此外strut從開始到內部的第一限定詞之間定義的預設public修改。但class預設值是private修改。
C 札記 虛繼承
由於多重繼承產生的二義性引入了類的虛繼承,先看下什麼是二義性。類d是類b和類c的派生類,而類b,類c就是繼承於類a,當d呼叫類a中的函式時不知道是類b繼承a的,還是類c繼承a的,引起了二義性。虛繼承可以解決這個問題。使用語法 class 派生類 virtual 繼承方式 虛基類 上圖中類d 例項化過...
四章 札記 C primer 之旅
陣列的型別 不能是引用。即不存在引用的陣列。陣列 char s c 等價於 char s2 陣列下標的正確型別是 size t 指標 理解指標宣告語句時,從右往左閱讀。ex string pstring 把 pstring 定義為 指向string 的指標。有效的指標 的三種狀態 1 乙個特定物件的...
十章 札記 C primer 之旅
兩個基本的關聯容器 map 關聯陣列,元素通過鍵來儲存和讀取 set 集合,multimap 同乙個鍵可多次出現的map multiset 同乙個鍵可多次出現的set pair型別 標頭檔案 utility map 型別 標頭檔案 map 建構函式 mapm mapm m2 建立m2的副本 mapm...