通过基类找继承类

背景

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

程序调用:

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。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值