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

时间:2016-04-15 07:06:24

标签: c++ inheritance

在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()中的这个抽象类?

3 个答案:

答案 0 :(得分:2)

简短的回答是:你不能。

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

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

答案 1 :(得分:0)

您可以使用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);

答案 2 :(得分:0)

如果您正在使用C ++ 11,则可以采用lambdas:

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
}