背景
在查找函数的定义的时候,发现了基类定义的该函数有两个继承类,都定义了该函数,不知道程序使用的是哪一个?
程序调用:
filter->isInterested(p) == -1
基数定义:
class Filter
{
public:
virtual int isInterested(const Packet& p){return -1;}
HttpCallBack getcb()
{
if(ix <0 || ix >= (int)cbs.size()) return NULL;
return cbs[ix];
}
protected:
Filter(){}
Filter(std::vector<std::string> urls0,std::vector<HttpCallBack> cbs0)
:urls(urls0),cbs(cbs0),ix(0){}
std::vector<std::string> urls;
std::vector<HttpCallBack> cbs;
int ix;
};
两个继承类定义:
class GetFilter : public Filter
{
public:
GetFilter(HttpCallBack cb)
{
cbs.push_back(cb);
}
int isInterested(const Packet& p)
{
if(0 == strncmp((const char*)p.data, "GET", 3))
return ix = 0;
return ix = -1;
}
};
class UrlFilter : public Filter
{
public:
UrlFilter(std::vector<std::string> interestedUrls,
std::vector<HttpCallBack> callbacks )
:Filter(interestedUrls,callbacks)
{
}
int isInterested(const Packet& p)
{
std::vector<std::string>::iterator it = find_if( urls.begin(), urls.end(), IsInterested(p) );
if( urls.end() != it)
{
//cout << *it << endl;
return ix = it - urls.begin();
}
else
{
return ix = -1;
}
}
private:
class IsInterested
{
public:
IsInterested(const Packet& p)
{
packetData.assign((char*)p.data, (size_t)p.dsize);
}
bool operator()(const string& url)
{
return boost::starts_with(packetData, url);
}
private:
string packetData;
};
};
解决思路
在函数初始化的时候,会使用继承类来定义。查找代码,可以看到如下内容
static UrlFilter uf(vector<string>(travelUrls, travelUrls+ sizeof(travelcbs)/sizeof(HttpCallBack) ), vector<HttpCallBack>(travelcbs, travelcbs+sizeof(travelcbs)/sizeof(HttpCallBack) ) ); HttpParser hpTravel(&uf); bool AnaTravel(PacketInfo* pktInfo) { return hpTravel.parse(pktInfo); }
由此确定使用的是UrlFilter。