/*
達內學習 C++ day52 2013-11-14
*/
回憶:
繼承
1,繼承的目的
a,代碼複用 傳承父類所有的數據(屬性和函數)
b,擴展 一個子類具備父類所有的功能和特性
把一個子類對象 當做父類對象來看
2,組合 和 繼承的關係
3,繼承的語法
class B:繼承方式 A{};
4,繼承的方式
公開 保護 私有
5,如果是私有繼承 如何對父類的數據進行訪問
public 接口 或者 友元
6,不能被子類繼承的
構造函數 析構函數 拷貝構造 賦值運算符
7,子類對父類構造函數 和 析構函數的調用
子類會默認調用父類的無參構造 和 析構函數
也可以指定調用父類的構造函數(初始化參數列表)
8,子類如何調用父類的拷貝構造函數和賦值運算符
子類會默認調用父類的拷貝構造函數 和 賦值運算符
一旦自定義了拷貝構造 和 賦值運算符 則必須顯示的調用父類拷貝構造和賦值運算符。
9,名字隱藏
當子類繼承了父類的數據,如果子類中定義了和父類重名的數據,則子類的數據會覆蓋掉父類的。
如何使用父類的數據 父類名::
10,多重繼承的語法
class C:public A,public B{};
11,多重繼承引入的問題的解決
a,命名衝突的解決
使用父類名::
名字隱藏機制
b,子類重複繼承父類的同名數據
可以採用虛繼承-----解決菱形繼承(多個類有共同父類和共同子類)
// -----------------------------------
多態
1,多態的概念 和 分析
一個父類對象的指針或者引用 執行或者引用子類對象時,調用父類型中定義的虛函數時,函數的表現會是相應的子類的實現。
繼承是構成多態的基礎,父類的指針和引用指向子類對象是前置條件,虛函數是構成多態的關鍵。
2,多態舉例
3,虛函數在子類中覆蓋父類的實現時,必須遵守函數重寫的規則(overwrite)
函數名,參數列表,返回值都必須相同 訪問權限沒有限制
4,多態的應用
爲了寫出通用性代碼
函數的參數 函數的返回值
5,多態的本質
虛函數表
對象的首地址 指向一個 存有虛擬函數地址的 虛擬函數表
6,運行時識別
a. typeid(類型)
typeid(對象)
typeinfo
name 取得類型名字
== 判斷兩個typeinfo 是否相等 判斷類型是否一致
!= 判斷兩個typeinfo 是否不等
#include<typeinf>
b,dynamic_cast<類型>(對象)
static_cast<類型>(對象)
靜態類型轉換 轉換之後無法判斷是否轉換成功,動態類型轉換 可以判斷是否類型轉換成功,指針爲空,代表轉換失敗。指針不爲空 代表轉換成功。
7,抽象類
具備純虛函數的類叫抽象類
virtual void foo()=0;
抽象類不能實例化
抽象類除了不能實例化之外 和一個普通的類沒有任何失敗。
如果一個類中除了構造函數 析構函數 外所有的函數都是純虛函數 這種類叫純抽象類。
如果子類繼承了抽象類,不去實現純虛函數則子類成爲抽象類。
8,如果一個父類指針指向一個子類對象 則 delete 父類對象指針 會調用父類對象的析構函數 ,子類析構的行爲是不確定的
父類對象的指針 = new 子類型();
把父類的析構函數作成虛析構函數
當父類中有虛函數時,則把析構函數作成虛函數
//=============================================================
C++ 中的IO
命令行進行輸入輸出
cin(istream) cout(ostream)
#include<iostream>
文件的輸入輸出
ifstream 文件讀
ofstream 文件寫
iofstream 既能讀也能寫
#include<fstream>
字符串的操作
istringstream
ostringstream
#include<sstream>
格式化IO 和 非格式化 IO
格式化:考慮類型 非格式化:字節處理,不考慮類型
get()得到一個字符 put()輸出一個字符