動態綁定只能應用在虛函數(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*/
/*