名称空间中的抽象方法

时间:2013-04-10 23:29:11

标签: c++

我有一个很奇怪的问题。

我有3个文件:
figure.h:

#ifndef FIGURE_H
#define FIGURE_H
namespace figure
{
    class figure
    {
        public:
            figure(position &p,color c);
            virtual bool canMove(const position &p)=0;
            virtual bool move(const position &p)=0;
        protected:
            color col;
            position &p;
    };
    class king : public figure
    {
    };
};
#endif // FIGURE_H

king.h:

#ifndef KING_H
#define KING_H

#include "./figure.h"
namespace figure
{
   class king : protected figure
   {
   };
}
#endif // KING_H

和king.cpp:

#include "king.h"
bool figure::king::canMove(const position &p)
{
}

我正在编译它: gcc -std = c11 -pedantic -Wall -Wextra

但问题是我收到了这个错误:

  

/src/figure/figure.h:24:45:错误:没有'布尔   figure :: king :: canMove(const position&)'声明的成员函数   class'figure :: king'

我该怎么办? 非常感谢你!

3 个答案:

答案 0 :(得分:5)

您需要在class king声明该功能。

class king : public figure
{
  virtual bool canMove(const position &p) override;  // This was missing.
};

修改

  

如果我没弄错的话,所有派生类都必须实现抽象函数

这是不正确的。您可能希望课程king 成为抽象类。与其他类成员一样,省略上面的声明告诉编译器king::canMove应该从figure::canMove继承 - 它应该仍然是纯虚拟的。

这就是你需要上述声明的原因。

答案 1 :(得分:0)

如编译器消息所示,您需要在declare类中canMove(const position&) king

答案 2 :(得分:0)

如错误消息所示,您尚未声明方法canMove()。只需在课程king

中声明
namespace figure
{
   class king : public figure
   {
   public:
       bool canMove(const position &p); 
   };
}