通过基类找继承类

来源:互联网 发布:好学近乎知 pdg 编辑:程序博客网 时间:2024/06/06 15:42

背景

在查找函数的定义的时候,发现了基类定义的该函数有两个继承类,都定义了该函数,不知道程序使用的是哪一个?

程序调用:

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。