【发布时间】:2017-02-28 08:38:39
【问题描述】:
我正在编写一个简单的 C++ 程序,并且很难理解我遇到的编译器错误。该问题是由于我试图从基类创建派生类引起的。我在下面发布了具有相同结构的代码,但更改了名称。
BaseClass.h
#ifndef BASECLASS_H
#define BASECLASS_H
class BaseClass {
public:
BaseClass(void);
virtual int method1(void) = 0;
virtual int method2(void) = 0;
virtual float method3(void) = 0;
};
#endif // BASECLASS_H
DerivedClass.h
#ifndef DERIVEDCLASS_H
#define DERIVEDCLASS_H
#include "DerivedClass.h"
class DerivedClass: public BaseClass
{
public:
DerivedClass(void);
};
#endif // DERIVEDCLASS_H
DerivedClass.cpp
#include "DerivedClass.h"
DerivedClass::DerivedClass(void)
{
}
int DerivedClass::method1(void)
{
// TODO
}
int DerivedClass::method2(void)
{
// TODO
}
float DerivedClass::method3(void)
{
// TODO
}
在尝试编译时,所有虚拟方法都出现以下错误:
no 'int DerivedClass::methodX()' member function declared in class 'DerivedClass'
只要我在“DerivedClass.h”中声明这些方法,错误就会消失,因为编译器现在知道这些方法。
但是,我很困惑。为什么必须在 DerivedClass.h 中重新声明纯虚函数?当我#include DerivedClass.h 时,它将自动包含 BaseClass.h,因此我假设我的 DerivedClass.cpp 应该完全了解这些方法。我做错了什么吗?
【问题讨论】:
-
每个派生类都必须覆盖其基类的虚函数。简单的规则。旁注:当你有一个不带参数的函数时,你不需要放 void。
-
@DeiDei 简单,但不完全正确
-
正确,这就是我在 DerivedClass.cpp 中尝试做的事情。但是,为什么要重新声明 DerivedClass.h 中的函数呢?编译器应该已经期待方法定义了吗?
-
@krzaq 显然它有点复杂,但如果你懒得学很多东西,它只会解决你的问题,所以我想我会提一下。
-
@DeiDei imo 这是一个明显的简化。
标签: c++ inheritance virtual