c++ - 设计问题 : Message processing components. .. 调用 incorect 重载函数

标签 c++ overloading



我想写一个消息处理的东西。主要组件是接收器、处理器、过滤器、翻译器和发送器。我想在处理器组件的“进程”功能上有一个单点故障,用于捕获异常、日志记录和指标。

正下方是控制台输出,显示了我出错的部分。

BASE
A
B
A


---FILTER---
FILTERED BASE
DID NOT FILTER A
Looks like a B     <------THIS IS WHAT I WANT
DID NOT FILTER B


---PROCESS---
FILTERED BASE
DID NOT FILTER A
DID NOT FILTER B   <-----THIS MAKES ME SAD

这些是类定义

#include <string>
#include <iostream>
#include <memory>
//**************MESSAGES ************************
class Message
{
public:
    virtual std::string getOut() const {return std::string("BASE");};
};

class MsgA : public Message
{
public:
    std::string getOut() const {return std::string("A");};
};

class MsgB : public Message
{
public:
    std::string getOut() const {return std::string("B");};
};


//**************FILTERS ************************
class MsgFilter
{
public:
    void filter(const std::tr1::shared_ptr<Message> msg)
    {
        if( msg->getOut().compare("BASE") == 0 )
        {
            std::cout << "FILTERED BASE" << std::endl;
        }
        else
        {
            std::cout << "DID NOT FILTER " << msg->getOut() <<  std::endl;
        }
    }
    void filter(const std::tr1::shared_ptr<MsgB> msg)
    {
        std::cout << "Looks like a B" << std::endl;
        filter((std::tr1::shared_ptr<Message>)msg);
    }
};

//**************PROCESSORS ************************
class MsgProcessor
{
public:
    MsgProcessor():myFilt(MsgFilter()){}
    MsgFilter myFilt;
    virtual void process(std::tr1::shared_ptr<Message> msg)
    {
        myFilt.filter(msg);
    }
};

下面是主要功能

#include "AllClassDefs.h"

int main(int argc, char *argv[])
{
    std::tr1::shared_ptr<Message> msg(new Message());
    std::tr1::shared_ptr<MsgA> msgA(new MsgA());
    std::tr1::shared_ptr<MsgB> msgB(new MsgB());

    std::cout << msg->getOut() << std::endl;
    std::cout << msgA->getOut() << std::endl;
    std::cout << msgB->getOut() << std::endl;

    std::tr1::shared_ptr<Message> msgAPtr(msgA);
    std::cout << msgAPtr->getOut() << std::endl;

    std::cout <<"\n\nFILTER---\n";

    std::tr1::shared_ptr<MsgFilter> flt(new MsgFilter());
    flt->filter(msg);
    flt->filter( (std::tr1::shared_ptr<Message>) msgA);
    flt->filter(msgB);

    std::cout <<"\n\nPROCESS---\n";

    std::tr1::shared_ptr<MsgProcessor> prc(new MsgProcessor());
    prc->process(msg);
    prc->process(msgA);
    prc->process(msgB);
}

所以...我希望流程函数调用 Filter(MsgB) 函数而不是 Filter(Message) 函数。通过使用 process(Message) 函数,看起来 Filter 无论如何都将 MsgB 视为消息。我怎样才能让它很好地工作?
我知道我可以使用模板,但这似乎有点矫枉过正......加上在一个有几百个消息类的系统中它可能会导致一个大的 exe。我应该使用双重调度吗?或者有更简单的解决方案吗?

最佳答案

你的问题是重载决议是在编译时执行的,所以这个函数

virtual void process(std::tr1::shared_ptr<Message> msg)

总是会调用相同的重载

void filter(const std::tr1::shared_ptr<Message> msg)

因为它匹配参数的静态类型。

如果 msg 有时碰巧指向一个派生类,这并不重要。

关于c++ - 设计问题 : Message processing components. .. 调用 incorect 重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7232588/

相关文章:

c++ - 当结构增长时,指向 vector 中元素的指针被设置为 NULL

c++ - 错误 LNK2001 : unresolved external symbol "public: double __thiscall

c++ - 为模板化( Armadillo )类专门化模板化函数

c++ - 这个函数调用在 C++ 中是如何模糊的?

c++: set<customClasS* 如何重载运算符<(const customClass&*...)?

c++ - 如何使这个析构函数成为虚拟的

c++ - 确定时间关键循环中 200 毫秒卡住的原因

c++ - 名称相同,来源不同的函数

C++如何在外部类中声明的内部类中使用变量

C++ - ostream、 friend 和命名空间