C++中多层担任(inheritance) 的利用及示例
当前位置:以往代写 > C/C++ 教程 >C++中多层担任(inheritance) 的利用及示例
2019-06-13

C++中多层担任(inheritance) 的利用及示例

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

    关键字:

在线提交作业