我有一个使用虚函数的头文件。
声明并定义:
#ifndef HeaderH
#define HeaderH
class Base {
<some code>
public:virtual int checkVal(int& val) { return val;}
};
#endif
我有另一个头文件声明了一些函数,并继承自这个基本头。
最后,我在另一个.cpp文件中实现了这个头文件: 我想在我的实现中覆盖虚函数checkVal,但我不断收到重定义错误。
int Base::checkVal(int& value)
{
if(value == 0)
value = 10;
return value;
}
我的头文件中是否应该包含哪些内容将覆盖Base虚函数?
答案 0 :(得分:3)
xxx.h
#ifndef HeaderH
#define HeaderH
class Base {
virtual int checkVal(int& val); // no definition
};
#endif
xxx.cpp
#include "xxx.h"
int Base::checkVal(int& value)
{
if (value == 0)
value = 10;
return value;
}
它工作正常。否则编译器将不知道使用什么定义。 只能有一个!
答案 1 :(得分:2)
您已在头文件中将该函数定义为{ return val;}
,您也无法将其定义为
{
if(value == 0)
value = 10;
return value;
}
程序中的任何其他位置。它只能有一个定义。可能你的意思是第二个定义是派生类(而不是Base),但这不是你的代码中的内容。你的问题根本没有使用单词class这一事实告诉我你可能会对虚函数的工作方式感到困惑。阅读它们,如何在派生类中定义虚函数应该非常明显。
它应该看起来像Derived::checkVal(int & value)
。注意使用“Derived”作为类名而不是“Base”。
答案 2 :(得分:2)
您已经在基类中提供了checkval()
的定义,那么为什么要重新定义它?您只能定义一次。如果您想在.cpp
文件中提供实现,只需在基类中声明checkval()
,就不需要在那里定义它。
如果您按以下方式调用checkval()
,则Base b;
//some code
b.checkval(10);//Error because temporaries cannot be bound to non-constant references
的实施失败:
checkval()
我的头文件中是否应包含哪些内容将覆盖Base虚函数?
在头文件中创建派生类并覆盖.cpp
,然后在派生类中声明函数并在{{1}}文件中定义它。
答案 3 :(得分:1)
我认为你的意思是压倒一切。并且您的实现缺少返回类型 - 它应该是:
int Base::checkVal(int& value)
答案 4 :(得分:1)
您的Base类中有两个实现,一个在头文件中,另一个在.cpp文件中。只需省略头文件中的那个。
答案 5 :(得分:1)
错误正是你应该得到的。
如果不创建从Base继承的新类,则无法重新定义该函数。
#ifndef DERIVED_H
#define DERIVED_H
#include "base.h"
class Derived : public Base{
<some code>
public:
virtual int checkVal(int& val)
{
if(value == 0)
value = 10;
return value;
}
};
#endif DERIVED_H
然后使用Derived
您将使用Base
。
请阅读Friendship and Inheritance。