C++ - 多层继承(inheritance) 的 使用 及 示例(二)

2014-11-24 02:34:53 · 作者: · 浏览: 7
ery_base() = default; //虚的析构函数
private:
virtual QueryResult eva l (const TextQuery&) const = 0; //纯虚函数
virtual std::string rep() const = 0;
};
//为Query_base提供接口(interface)
class Query {
friend Query operator~ (const Query &); //取反
friend Query operator| (const Query&, const Query&); //取或
friend Query operator& (const Query&, const Query&); //取交
public:
Query(const std::string&);
QueryResult eva l(const TextQuery &t) const { return q->eva l(t); } //估值关联的查询
std::string rep() const { return q->rep(); } //生成string版本的查询
private:
Query(std::shared_ptr query) : q(query) {}
std::shared_ptr q; //使用动态绑定
};
//重载输出(<<)操作符
std::ostream & operator<<(std::ostream &os, const Query &query)
{
return os << query.rep();
}
//单词查询类
class WordQuery : public Query_base {
friend class Query;
WordQuery (const std::string &s) : query_word (s) {}
QueryResult eva l (const TextQuery &t) const { return t.query(query_word); }
std::string rep() const { return query_word; };
std::string query_word;
};
//Query接口实现动态绑定WordQuery
inline Query::Query (const std::string &s) : q(new WordQuery(s)) {}
//取反查询
class NotQuery : public Query_base {
friend Query operator~ (const Query &); //友元是取反函数
NotQuery (const Query &q) : query(q) {}
std::string rep() const {return "~("+query.rep()+")";}
QueryResult eva l (const TextQuery &t) const;
Query query;
};
//实现取反操作, 动态绑定NotQuery对象
//最终使用的是WordQuery类, Query构建需要WordQuery, 再传入NotQuery;
inline Query operator~ (const Query &operand) {
return std::shared_ptr (new NotQuery(operand));
}
//二元查询, 没有eva l, 则继承纯虚函数
class BinaryQuery : public Query_base {
protected:
BinaryQuery (const Query &l, const Query &r, std::string s) :
lhs(l), rhs(r), opSym(s) {}
std::string rep() const {
return "(" + lhs.rep() + " " + opSym + " " + rhs.rep() + ")"; }
Query lhs, rhs;
std::string opSym;
};
//取并查询
class AndQuery : public BinaryQuery {
friend Query operator& (const Query&, const Query&);
AndQuery (const Query& left, const Query& right) : BinaryQuery (left, right, "&") {}
QueryResult eva l (const TextQuery&) const;
};
inline Query operator& (const Query& lhs, const Query& rhs) {
return std::shared_ptr(new AndQuery(lhs, rhs));
}
//取或查询
class OrQuery : public BinaryQuery {
friend Query operator| (const Query&, const Query&);
OrQuery (const Query& left, const Query& right) : BinaryQuery (left, right, "|") {}
QueryResult eva l (const TextQuery&) const;
};
inline Query operator| (const Query& lhs, const Query& rhs) {
return std::shared_ptr(new OrQuery(lhs, rhs));
}
QueryResult OrQuery::eva l(const TextQuery& text) const {
auto right = rhs.eva l(text), left = lhs.eva l(text);
auto ret_lines = std::make_shared >(left.begin(), left.end());
ret_lines->insert(right.begin(), right.end());
return QueryResult(rep(), ret_lines, left.get_file());
}
QueryResult AndQuery::eva l(const TextQuery& text) const {
auto left = lhs.eva l(text), right = rhs.eva l(text); //调用的是WordQuery的eva l
auto ret_lines = std::make_shared>();
std::set_intersection(left.begin(), left.end(