覆盖代码体中的虚函数

时间:2013-08-19 11:51:41

标签: c++ abstract

我对C ++中的虚函数有疑问。我花了最后一小时搜索,但我很快就到了,我希望你能帮忙。
我有一个处理发送和接收数据的类。我希望这个类尽可能模块化,因此我想制作一个抽象/虚拟方法来处理收到的消息。
虽然我知道我可以创建一个新类并覆盖虚方法,但我真的不想创建一大堆新类,它们都以不同的方式实现该方法。在Java中,您可以在声明对象时使用侦听器和/或覆盖代码体中的抽象方法,如示例中所示。

JTextField comp = new JTextField();   
comp.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        //Handler Code
    }
});

这在C ++中是否可行,或者是否有更好的解决此类问题的方法?

欢呼和许多提前感谢,
克里斯。

3 个答案:

答案 0 :(得分:3)

请仔细查看其他SO帖子Does C++0x Support Anonymous Inner Classes,因为问题听起来很相似。

Functors(函数对象)或lambdas可能是合适的替代品。

答案 1 :(得分:1)

在C ++中,您需要声明一个新类:

class MyActionListener: public ActionListener
{
    public:
       void actionPerformed(ActionEvent evt) { ... code goes here ... }
}; 

答案 2 :(得分:0)

这个问题已经得到了回答,但我认为我会把它扔进去。示例中链接的SO讨论很好,但主要集中在复制Java体验上。这是一种更惯用的C ++方式:

struct EventArgs
{
    int param1;
    int param2;
};

class network_io
{
    typedef std::function<void (EventArgs)> Event;
    typedef std::vector<Event> EventList;

    EventList Events;

public:
    void AddEventHandler(Event evt)
    {
        Events.push_back(evt);
    }

    void Process()
    {
        int i,j;
        i = j = 1;
        std::for_each(std::begin(Events), std::end(Events), [&](Event& e)
        {
            EventArgs args;
            args.param1 = ++i;
            args.param2 = j++;

            e(args);
        });
    }
};

int main() 
{
    network_io ni;

    ni.AddEventHandler([](EventArgs& e)
    {
        std::cout << "Param1: " << e.param1 << " Param2: " << e.param2 << "\n";
    });

    ni.AddEventHandler([](EventArgs& e)
    {
        std::cout << "The Param1: " << e.param1 << " The Param2: " << e.param2 << "\n";
    });

    ni.Process();
}