使用声明实现此抽象类

时间:2015-09-30 12:04:26

标签: c++ class interface abstract

我正在为c ++实现Automatak opendnp3库。我想添加Master to a Channel。正如您从此定义中看到的,此操作的参数是:

...
opendnp3::IMasterApplication& appliction,
...

IMasterApplication接口描述为here。所以我创建了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;

我在这里误解了什么?

2 个答案:

答案 0 :(得分:3)

如注释中所述,每当实现抽象类(接口)时,必须在派生类中定义属于抽象类的所有纯虚方法(在主体中提供)。然后只有派生类变得具体,并且可以用作类型。否则它也会变得抽象。

“那么方法的声明是否使它成为非抽象的?”

不是声明,而是定义。方法已在基类(接口)中声明(作为纯虚拟)。在派生类中赋予它们定义(主体)会使派生类非抽象(具体)。

“另外,我是否只需在masterApplication中声明它而不实际使用它?”

您需要定义派生类中基类的所有纯虚方法。是否使用取决于您的使用情况。

答案 1 :(得分:3)

完成HappyCoder's answer

查看opendnp3::IMasterApplication,您可以看到它继承自opendnp3::ILinkListeneropendnp3::IUTCTimeSource

虽然第一个没有任何纯虚方法,但这里是第二个代码(source):

class IUTCTimeSource
{

public:
    virtual UTCTimestamp Now() = 0;
};

然后,您需要重载类Now()中的函数masterApplication,以使其不抽象。