在C ++中重新定义头文件之间的虚函数

时间:2010-01-20 11:52:58

标签: c++ inheritance

我有一个使用虚函数的头文件。

声明并定义:

#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虚函数?

6 个答案:

答案 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