不能实例化抽象类c++问题

#ifndef QUERY
#define QUERY
#include "TextQuery.h"
class Query_base
{
friend class Query;
protected:
typedef TextQuery::line_no line_no;
virtual ~Query_base(){}
private:
virtual set eval(const TextQuery&)const=0;
virtual ostream& display(ostream& =cout)const=0;
};
class Query
{
private:
friend Query operator~(const Query &);
friend Query operator&(const Query &,const Query&);
friend Query operator|(const Query &,const Query&);
Query_base q;
size_t *use;
void decr_use()
{
if(--*use==0)
{delete q;delete use;}
}
Query(Query_base
query):q(query),use(new size_t(1)){}
public:
Query(const string &);
Query(const Query &rhs)
{

    q=rhs.q;
    use=rhs.use;
    ++*use;
}
Query& operator=(const Query& rhs)
{
    decr_use();
    q=rhs.q;
    use=rhs.use;
    ++*use;
    return *this;
}
~Query()
{
    decr_use();
}
set<TextQuery::line_no> eval(const TextQuery &t)const
{
    return q->eval(t);
}
ostream& display(ostream &os)const
{
    return q->display(os);
}

};
ostream& operator<<(ostream &os,const Query& query)
{
return query.display(os);
}
class WordQuery:public Query_base
{
private:
friend class Query;
WordQuery(const string &s):query_word(s){}
string query_word;
ostream& display(ostream &os)const
{
return os< }
set eval(const TextQuery &t)const
{
return t.run_query(query_word);
}
};
Query::Query(const string &s)
{
q=new WordQuery(s);
use=new size_t(1);
}
class NotQuery:public Query_base
{
private:
friend Query operator~(const Query &);
Query query;
set eval(const TextQuery &file)const
{
set has_val=query.eval(file);
set ret_line;
for(line_no i=0;i!=file.size();i++)
if(has_val.find(i)==has_val.end())
ret_line.insert(i);
return ret_line;
}

NotQuery(Query q):query(q){}
ostream& display(ostream &os)const
{
    return os<<"~("<<query<<")";
}

};
Query operator~(const Query &oper)
{
return new NotQuery(oper);
}
class BinaryQuery:public Query_base
{
protected:
const Query lhs,rhs;
const string oper;
BinaryQuery(Query right,Query left, string op):rhs(right),lhs(left),oper(op){}
ostream &display(ostream &os)
{
return os<<"("<<lhs<<" "<<oper<<" "<<rhs<<")";
}
};
class AndQuery : public BinaryQuery
{
friend Query operator&(const Query&,const Query &);
AndQuery(Query left, Query right):BinaryQuery(left,right,"&"){ }

set<line_no> eval(const TextQuery& file)const;

};
setTextQuery::line_no AndQuery::eval(const TextQuery& file)const
{
set right=rhs.eval(file);
set left=lhs.eval(file);
set ret_lines;
set::const_iterator iter=right.begin();
for(;iter!=right.end();++iter)
if(left.find(*iter)!=left.end())
ret_lines.insert(*iter);
return ret_lines;
}
Query operator&(const Query &lhs,const Query &rhs)
{
return new AndQuery(lhs,rhs);
}
class OrQuery: public BinaryQuery
{
friend Query operator|(const Query&,const Query &);
OrQuery(Query left,Query right):BinaryQuery(left,right,"|"){ }

set<line_no> eval(const TextQuery& file)const
{
    set<line_no> right=rhs.eval(file);
    set<line_no> left=lhs.eval(file);

    set<line_no>::const_iterator iter=right.begin();
    for(;iter!=right.end();++iter)
        left.insert(*iter);
    return left;
}

};
Query operator|(const Query &lhs,const Query &rhs)
{
return new OrQuery(lhs,rhs);
}

#endif


提示错误 1 error C2259: “AndQuery”: 不能实例化抽象类 d:\vsproject\new_query\new_query\query.h 155 1 New_query

错误 2 error C2259: “OrQuery”: 不能实例化抽象类 d:\vsproject\new_query\new_query\query.h 159 1 New_query

跟答案一样,为什么我这个提示错误?

2个回答

  • 代码按照代码的格式贴,不然很难看得清楚啊
  • 基本上来说,
  • 1.首先你应该知道抽象类是不能实例化的
  • 2.如果你的抽象类的派生类有任何一个纯虚函数没有实现,那么不管其他做的再多,这个类仍然是一个抽象类、
u013622746
sdf3fs 回复知常曰明: 谢啦,太感谢啦,我看一早晨了。。 以后真得认真一点了。。 我最开始就纳闷怎么就是抽象类了呢,display函数,eval函数都定义了
4 年多之前 回复
gamefinity
知常曰明 回复sdf3fs: 你的BInaryQuery里面display的实现缺少一个const
4 年多之前 回复
u013622746
sdf3fs http://bbs.csdn.net/topics/391041796这里的代码有格式。
4 年多之前 回复

你上面没有实现Query_base的纯虚方法,而是直接继承的,可以实现方法在看看吧

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!