動態綁定只能應用在虛函數(virtual function), 通過指針(->)或引用(.)調用; 聲明基類指針, 綁定派生類對象;
可以使用"shared_ptr<Abstract_Base_Class> p(new Derived_Class(para));"的形式, 動態綁定派生的類;
可以為動態基類添加一個接口(interface), 使用友元函數, 訪問基類的私有成員變量; 並把具體操作寫入接口中;
如果一個派生類, 沒有實現抽象基類的純虛函數, 則會繼承此函數, 那麼這個派生類也是抽象基類;
抽象基類不能創建具體的對象, 但是可以實現具體的方法, 為派生類提供繼承;
面向對象編程: 抽象(abstraction), 即數據抽象(data abstraction);繼承(inheritance);多態(polynorphism), 即動態綁定(dynamic binding).
具體代碼如下, 詳見注釋:
/* * cppprimer.cpp * * Created on: 2013.11.7 * Author: Caroline */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #include <fstream> #include <sstream> #include <string> #include <vector> #include <memory> #include <algorithm> #include <iterator> #include <set> #include <map> using namespace std; class QueryResult; std::ostream& print(std::ostream& os, const QueryResult &qr); class TextQuery { public: using line_no = std::vector<std::string>::size_type; TextQuery(std::ifstream& ); QueryResult query(const std::string& ) const; private: std::shared_ptr<std::vector<std::string> > file; //文件內容 std::map<std::string, std::shared_ptr<std::set<line_no> > > wm; //詞和行號的集合 }; /*把每一行放入text, 存入file(vector), 組成word和行號(set)的映射*/ TextQuery::TextQuery(std::ifstream &is) : file(new std::vector<std::string>) { std::string text; while (std::getline(is, text)) { file->push_back(text); int n = file->size() - 1; std::istringstream line(text); std::string word; while (line >> word) { auto& lines = wm[word]; if (!lines) lines.reset(new set<line_no>); lines->insert(n); } } } class QueryResult { friend std::ostream& print (std::ostream&, const QueryResult& ); public: using line_no = std::vector<std::string>::size_type; QueryResult (std::string s, //查詢單詞 std::shared_ptr<std::set<line_no>> p, //匹配行號 std::shared_ptr<std::vector<std::string>> f) : //輸入文件 sought(s), lines(p), file(f) {} std::set<line_no>::iterator begin() { return lines->begin(); } std::set<line_no>::iterator end() { return lines->end(); } std::shared_ptr<std::vector<std::string>> get_file() { return file; } private: std::string sought; //查找字符串 std::shared_ptr<std::set<line_no>> lines; //行號集合 std::shared_ptr<std::vector<std::string>> file; //文件集合 }; /*找到指定sought的集合, 返回迭代器, 傳入string和set*/ /*