/*
達內學習 C++ day53 2013-11-15
*/
1,多態的概念和分析
當父類對象的指針或引用指向子類對象時,調用父類型中定義的虛函數,調用的表現會是相應的子類的實現。
繼承是多態的基礎,父類對象的指針或引用是多態的前置條件,虛函數是關鍵。
2,多態的舉例
3,函數的重寫;
虛函數的重寫(overwrite);
參數列表和返回值都必須相同(權限沒有限制);
異常不能拋出更大或者更多;
4,多態的應用
通用性編程(函數的參數函數的返回值)
5,多態的本質
虛函數表
6,運行時識別
a.typeid 返回一個類型信息 或者 一個對象的類型信息
type_info -----------#include<typeinfo>
name()類型名字 ==類型相等 !=類型不等
識別多態類型 必須滿足多態要求
b.dynamic_cast<類型>(對象)
static_cast<類型>(對象)
具備多態性的類型轉換 必須使用dynamic_cast 如果成功返回合法地址,不成功返回 NULL,引用類型轉換不成功拋出異常;
static_cast 無論是否合法都會返回合法地址
7,抽象類
具備純虛函數的類 叫抽象類
抽象類不能實例化 除此之外和其他類沒有區別
如果一個類繼承了一個抽象類沒有實現純虛函數 還是抽象類
virtual void show() = 0;
8,虛析構函數
當一個類中有虛函數時,就把析構函數定義成虛析構函數。
爲確保子類的析構函數會調用。
//====================================================
C++中的io
1,c++ io的分類
針對控制檯 #include<iostream>
istream ostream
cin cout
針對文件 #include<fstream>
ifstream ostream fstream
針對字符串 #include<sstream>
istringstream ostringstream
2,非格式化io
put get
getline() 讀取一行數據 可以指定結束符號
cin.clear() 復位 糾正流的狀態 但是不清空緩衝區
ignore(int n,char c = '\n') 最多忽略掉n個字符,到 c爲止。
putback(char c)退回一個字符
peek() 察看一個字符,不動文件指針 相當於察看後還回
3,字符串操作
string c++中的字符串
把C的字符串轉換成C++ string
string string(const char* str)
常用的運算符 == + += []
常用的函數 .size() c_str()
轉換成C串 string str; const char* cstr = str.c_str();
流輸入的數據最終會變成字符串
ostringstream ostr;
ostr<<123;
數據來字字符串
istringstream istr;
int data;
istr>>data;
當前時間對應日期2013-11-1514:25:38
char timestr[100];
time_t t = time(0);
struct tm* mytm = localtime(&t);
sprintf(timestr,"%04d-%02d-%02d%02d:%02d:%02dtestfile",mytm->tm_year+1900,mytm->tm_mon+1,mytm->tm_mday,mytm->tm_hour,mytm->tm_min,mytm->tm_sec);
C++的字符串格式拼接
ostringstream ostr;
ostr<<123<<' '<<123.45<<' '<<"test";
把流對象變成字符串
string cppstr = ostr.str();
4,文件的輸入輸出
ifstream(c串,模式)
ofstream(c串,模式)
fstream(c串,模式)
模式:ios::in ios::out ios::binary ios::app
ios::trunc(清空) ios::ate(跳到文件尾,如果是輸出流則把文件清空)
如果流對象有文件名並創建對象成功,則同時文件打開。
read(數據地址,大小);返回值都是對象
write(數據地址,大小);
gcount() 本次讀取的數據量
以dog爲單位進行讀寫
使用read write gcount 讀取一個文件的內容,然後把讀取到的內容 每個字節都和一個固定的隨機數據^操作,然後把這個數據寫入另一個文件
//----
istream seekg 調整讀取的位置
tellg 得到讀取的位置
ostream seekp 調整寫的位置
tellp 得到寫的位置
SEEK_CUR ios::cur ios::beg ios::end
隨機讀寫文件
清空文件 cat /dev/null> file
fsream
//=============
異常 exception
系統異常
用戶自定義異常
c++中任何類型的數據都有表示異常
如果一個類裏沒有虛函數 則typeid不會拋出異常,當這個類中有虛函數 並且這個類的指針指向NULL,則對這個指針指向的對象進行使用 typeid 則會拋出bad_typeid