C ++中的虚函数声明和继承

时间:2014-05-11 20:22:30

标签: c++ inheritance abstract-class

我有一个试图从基本抽象类创建派生类的程序。我的.h文件在这里。

#ifndef SHIP_H
#define SHIP_H
class Ship
{
  public:
    virtual ~Ship(void) {}
    virtual const char *name(void) const = 0;
    virtual int size(void) const = 0;
    int getX(int i) const;
    int getY(int i) const;
    void print(void) const;
    bool includes(int x, int y);
int level(void) const;
void decreaseLevel(void);
static Ship *makeShip(char ch, int x1, int y1, int x2, int y2);
  protected:
    void setPos(int a1, int b1, int a2, int b2);
    int lev;
  private:
    bool checkConfig(int x1, int y1, int x2, int y2);
    int x1,y1,x2,y2;
    };

class AircraftCarrier : public Ship
{
  public:
   AircraftCarrier(int x1, int y1, int x2, int y2);
   virtual const char *name(void) const;
   virtual int size(void) const;
};

在我的Ship.cpp文件中我有:

const char *name (void) {

    const char * ret = "AircraftCarrier"; 
    return ret;
}

然而,这并未在我的派生类AircraftCarrier的特定范围内声明。但每当我添加

const char AircraftCarrier :: *name {...}

我收到错误:

Ship.cpp:46:9:错误:无法将'const char *'转换为'const char AircraftCarrier :: *'作为回报   返回;

3 个答案:

答案 0 :(得分:2)

您在Ship.cpp中尝试声明的函数的名称是AircraftCarrier :: name(),该函数应根据头文件中的声明返回一个const char *。

const char *AircraftCarrier::name() {...}

答案 1 :(得分:1)

这个定义:

const char *AircraftCarrier::name() {...}

不正确。尝试使用它,你会得到“成员未找到”编译错误。您的声明和定义必须具有相同的原型。所以如果你写的是:

virtual const char *name(void) const;
        ^^^^^                  ^^^^^
<。> .h中的声明,那么你在.cpp中的定义必须完全匹配proto中的声明。正确的定义是:

const char* AircraftCarrier::name() const 
{
    // your complex code here
}

答案 2 :(得分:0)

应该是:

const char* AircraftCarrier :: name {...}

*是返回类型规范的一部分,而不是函数名称。