C++中多层担任(inheritance) 的利用及示例
动态绑定只能应用在虚函数(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*/ /*Executing Query for: ((fiery & bird) | wind) ((fiery & bird) | wind) occurs 3 times (line 2) Her Daddy says when the wind blows (line 4) like a fiery bird in flight (line 5) A beautiful fiery bird he tells her作者:csdn博客 Spike_King