如何调用子类函数实现的纯虚基类方法?

时间:2014-10-27 16:57:52

标签: c++ qt

我有两个课程:AbstractClassSubClass

这基本上是我的代码(好吧,只是一些示例代码):

abstractclass.h

class AbstractClass
{
public:
    AbstractClass();
    void doSomething();

protected:
    virtual void implementMe() = 0;
    int a;
};

abstractclass.cpp

#include "abstractclass.h"
AbstractClass::AbstractClass(){}

void AbstractClass::doSomething()
{
    implementMe();  // compiler error: "implementMe() was not declared in this scope"
    a = 0;          // same compiler error here...
}

subclass.h

#include "abstractclass.h"
class SubClass : public AbstractClass
{
public:
    SubClass();

protected:
    void implementMe();
};

subclass.cpp

#include "subclass.h"
SubClass::SubClass() {}

void SubClass::implementMe()
{
    // do some stuff
}

然而,在AbstractClass中,我不断收到编译器错误(对于虚函数以及类变量):

  

implementsMe()未在此范围内声明

我发现摆脱这种情况的唯一方法是使用前向声明:

void implementMe();
AbstractClass::doSomething()
{
    implementMe();
}

我不敢相信这是正确的方法吗?

谢谢!

编辑:

好的,因为我对C++中的子类化的概念性理解似乎并不完全错误(请参阅注释),我将分享一些原始的源代码。希望这有助于识别错误。

这是我的抽象/基类:

abstractenvironment.h

#ifndef ABSTRACTENVIRONMENT_H
#define ABSTRACTENVIRONMENT_H

#include <QObject>

class AbstractEnvironment : public QObject
{
    Q_OBJECT
public:
    AbstractEnvironment(QObject *parent = 0);

protected:
    virtual void process() = 0;
    quint32 counter;

private slots:
  void handleTimeout();
};
#endif // ABSTRACTENVIRONMENT_H

abstractenvironment.cpp

#include "abstractenvironment.h"
#include <QTimer>

QTimer *myTimer;

AbstractEnvironment::AbstractEnvironment(QObject *parent) :
    QObject(parent)
{
    myTimer = new QTimer(this);
    connect(myTimer, &QTimer::timeout, this, &AbstractEnvironment::handleTimeout);
    myTimer->start(1);
    counter = 0;
}

void handleTimeout()
{
    process();
    counter++;
}

这是我的子类:

environment.h

#ifndef ENVIRONMENT_H
#define ENVIRONMENT_H

#include "abstractenvironment.h"
class Environment : public AbstractEnvironment
{
    Q_OBJECT
public:
    Environment(Controller *controller, QObject *parent = 0);

protected:
    void process();
};
#endif // ENVIRONMENT_H

environment.cpp

#include "environment.h"

Environment::Environment(Controller *controller, QObject *parent) :
    AbstractEnvironment(controller, parent) {}

void Environment::process()
{
    // do something
}
PS:我从这个问题的第一部分开始学习并试图用MinGW在Qt里面编译上面的源代码。我收到两条错误消息(正如预期的那样):

..\untitled\abstractenvironment.cpp: In function 'void handleTimeout()':
..\untitled\abstractenvironment.cpp:17:13: error: 'process' was not declared in this scope
..\untitled\abstractenvironment.cpp:18:5: error: 'counter' was not declared in this scope

如果您想自己尝试一下,我已经将Qt项目压缩并将uploaded压缩到我的Dropbox(当然我会在某些时候删除此文件,但代码与上面的帖子 - &gt;它只是为了方便起见,所以你不必自己复制粘贴它)

2 个答案:

答案 0 :(得分:6)

编辑:你刚刚改变了你的问题。因此,我无法判断您的原始文本是否是您的实际源代码。良好的经验法则,粘贴您的实际代码而不是解释它(然后在需要时去除识别或减少它)。

原始回答:

implementMe();  // compiler error: "implementMe() was not declared in this scope"

这是因为在AbstractClass中没有正确声明doSomething()。你&#34;宣布&#34;它在基类中:

doSomething();

编译器无法识别AbstractClass :: doSomething()的行外定义,因此实现中的任何内容都不会解析为类作用域。

将其更改为:

void doSomething();

就像派生类一样。

AbstractClass::doSomething()
{
    implementMe();
}

void AbstractClass::doSomething()
{
    implementMe();
}

更新:

void handleTimeout()
{
    process();
    counter++;
}

是一个全局函数。这不是类的实现。它应该是:

void AbstractClass::handleTimeout()
{
    process();
    counter++;
}

答案 1 :(得分:2)

abstractenvironment.cpp中定义void handleTimeout(),这是非成员函数,与AbstractEnvironment类无关。因此,它不会查找AbstractEnvironment::process()AbstractEnvironment::counter,而是查找::process()::counter(未声明,因此错误)。

将其更改为void AbstractEnvironment::handleTimeout(),它应该编译。