我正在为C ++实现Automatak opendnp3库。我想添加一个Master to a Channel。从该定义可以看到,此操作的参数为:
...
opendnp3::IMasterApplication& appliction,
...
在here中描述了IMasterApplication接口。因此,我创建了masterApplication.cpp和masterApplication.h文件,并尝试实现该类,如下所示:
masterApplication.cpp
#include "masterApplication.h"
#include <opendnp3/master/IMasterApplication.h>
#include <iostream>
#include <chrono>
using namespace opendnp3;
using namespace asiodnp3;
using namespace std;
masterApplication::masterApplication() {
}
masterApplication::~masterApplication() {
}
masterApplication.h
#ifndef MASTERAPPLICATION_H_
#define MASTERAPPLICATION_H_
#include <opendnp3/master/IMasterApplication.h>
#include <opendnp3/link/ILinkListener.h>
#include <openpal/executor/IUTCTimeSource.h>
class masterApplication : public opendnp3::IMasterApplication
{
private:
public:
masterApplication();
virtual ~masterApplication();
};
#endif
但是,当我尝试在main中声明一个masterApplication对象以使用时:
masterApplication iMaster;
然后将其放在AddMaster函数中,我得到错误:
main.cpp:57:20: error: cannot declare variable ‘iMaster’ to be of abstract type ‘masterApplication’
masterApplication iMaster;
我在这里误会什么?
最佳答案
如评论中所述,无论何时实现抽象类(接口),都必须在派生类中定义抽象类的所有纯虚方法(带有主体)。然后,只有派生的类成为具体的,并且可以用作类型。否则,它也会变得抽象。
“那么,方法的声明是否使其非抽象?”
不是声明,而是定义。方法已经在基类(接口)中声明为纯虚拟方法。在派生类中给它们定义(主体)会使派生类成为非抽象(具体)。
“而且,我是否只需要在masterApplication中声明它而不实际使用它?”
您需要在派生类中定义基类的所有纯虚方法。是否使用它们取决于您的用例。