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

C++ 如何调用由子类函数实现的纯虚拟基类方法?,c++,qt,C++,Qt,我有两个类:AbstractClass和SubClass 这基本上是我的代码(好的,只是一些示例代码): abstractclass.h abstractclass.cpp 子类.h 子类.cpp 然而,在AbstractClass中,我不断得到一个编译器错误(对于虚函数和类变量): 此作用域中未声明implementMe() 我发现解决这个问题的唯一方法是使用转发声明: void implementMe(); AbstractClass::doSomething() { impleme

我有两个类:
AbstractClass
SubClass

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

abstractclass.h
abstractclass.cpp
子类.h
子类.cpp
然而,在
AbstractClass
中,我不断得到一个编译器错误(对于虚函数和类变量):

此作用域中未声明implementMe()

我发现解决这个问题的唯一方法是使用转发声明:

void implementMe();
AbstractClass::doSomething()
{
    implementMe();
}
但是,我不能相信这是正确的方法

谢谢

编辑: 好的,由于我对
C++
中的子类的概念性理解似乎并没有完全错误(参见注释),我将分享一些我的原始源代码。希望这将有助于识别错误

这是我的抽象/基类:

abstractenvironment.h
这是我的子类:

environment.h
environment.cpp
PS:我已经从这个问题的第一部分学到了一些东西,并尝试用MinGW在Qt内部编译上面的源代码。我正好收到两条错误消息(如预期的那样):


如果您想自己尝试,我已经将Qt项目压缩到我的Dropbox中(当然我会在某个时候删除此文件,但代码与上面的文章完全相同-->只是为了方便起见,所以您不必自己复制粘贴)

编辑:您刚刚更改了问题。所以我不知道你的原始文本是不是你真正的源代码。好的经验法则是,粘贴实际代码,而不是解释它(然后根据需要取消标识或减少代码)

原始答复:

implementMe();  // compiler error: "implementMe() was not declared in this scope"
这是因为doSomething()在AbstractClass中没有正确声明。您在基类中使用以下命令“声明”了它:

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

改为:

void doSomething();
就像在派生类中一样

更新:

void handleTimeout()
{
    process();
    counter++;
}
是一个全局函数。这不是类实现。应该是:

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

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


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

implementMe()内部
抽象类::doSomething()
尝试调用
抽象类::implementMe()
我认为这不是问题所在,但您没有
在类定义之后。@Creris这有什么错吗?您在
doSomething
@mozzbozz上没有返回类型:修复了该错误(以及
子类
构造函数的错误名称),您发布的代码为我编译。请在没有其他错误的情况下发布给出您所询问的错误的代码。是的,对不起,这是一个错误,因为我解释了我的代码(请参阅对我问题的评论)。然而,这将导致一些不同的编译器错误。我认为解释代码会更好,因为它更容易理解,我认为我的错误是一些概念上的误解,而不是一个“正常”的错误…有些事情正在发生。你的代码是正确的(至少在我脑子里是编译的)。寻找其他地方的问题。如果您的原型与越界定义不同,您将得到该错误。我刚刚更新了问题,以包含原始代码,正如您所建议的。请参阅更新后的我的修订部分。您没有使用类作用域限定handleTimeout()函数,因此它是一个全局函数。非常感谢!小错误,巨大的影响:当一个新的C++和来自java/C的时候发生这样的事情。终于奏效了:)我已经读了很多遍了,现在却没有注意到:/
#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++;
}
#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
#include "environment.h"

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

void Environment::process()
{
    // do something
}
..\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
implementMe();  // compiler error: "implementMe() was not declared in this scope"
doSomething();
void doSomething();
AbstractClass::doSomething()
{
    implementMe();
}
void AbstractClass::doSomething()
{
    implementMe();
}
void handleTimeout()
{
    process();
    counter++;
}
void AbstractClass::handleTimeout()
{
    process();
    counter++;
}