繁体   English   中英

C ++中抽象类的内联继承

[英]Inline inheritance of an abstract class in C++

在Java中,我们可以在这样的方法中继承接口:

public Class myClass {
    void myMethod() {
        myInterface listener = new myInterface() {
            public onClick() {
                //code goes here
            }
        };
        setListener(listener);
    }
}

在C ++中; 假设我有一个抽象类:

class myInterface {
    public:
        myInterface();
        virtual ~myInterface() {};
        virtual void onClick() = 0;
}

我尝试内联继承此抽象类,如下所示,但它给出了错误:

myClass::myMethod() {
    myInterface *listener;
    listener = new myInterface() {
        virtual void onClick() {
            //some code here
        }
    };
    setListener(listener);
    delete listener;
}

我在互联网上找到的所有示例和教程都通过子类解释继承。 但是,如何在myClass :: myMethod()中内联继承此抽象类呢?

简短的答案是:您不能。

您没有错过任何秘密关键字或编译器功能。

C ++不是Java。 C ++人们使用不同的模式,习语和语法技巧来达到相同的效果。 您需要阅读一本好书或教程才能获得它们。

您可以使用C ++方式:

包括

#include <boost/signals2.hpp>

class notifier {
public:
  void notify(int i) {
    handlers(i);
  }
  boost::signals2::connection add_listener(std::function<void(int)> listener) {
   return handlers.connect(std::move(listener));
  }
  void remove_listener(boost::signals2::connection &connection) {
    handlers.disconnect(connection);
  }
private:
  boost::signals2::signal<void(int)> handlers;
};
...
notifier n;
n.add_listener([](int i) {
  std::cout << i << std::endl;
});
n.notify(100);

如果您使用的是C ++ 11,则可以采用lambda:

class myLambdaListener : public myInterface{
    public:
        myLambdaListener(const std::function<void()>& func) : mFunction(func){}
        void onClick() override {if(mFunction) mFunction();}
    private:
    std::function<void()> mFunction;
}

myClass::myMethod() {
    myInterface *listener;
    listener = new myLambdaListener([](){
            //some code here
    });
    setListener(listener);
    //delete listener; - do not delete here
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM