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