【问题标题】:must implement the inherited pure virtual method of motherclass必须实现母类继承的纯虚方法
【发布时间】:2016-10-08 23:48:56
【问题描述】:

以下问题: 我有一个抽象母类,两个子类和一个类,它使用子类的功能。

母班:

Vektor.h

class Vektor {
public:
    Vektor();
    virtual bool range() const = 0;
    virtual ~Vektor();
};

子类:

绝对向量.h

class Absolutvektor: public Vektor {
public:
    Absolutvektor(int x, int y);
    int x;
    int y;
    virtual ~Absolutvektor();
    virtual bool range (int x, int y);
};

Einheitsvektor.h

class Einheitsvektor : public Vektor {
public:
    Einheitsvektor(int x, int y, int richtung);
    int x;
    int y;
    int richtung;
    virtual ~Einheitsvektor();

    virtual bool Einheitsvektor::range (int richtung);

};

“普通班”: schiff.h

#pragma once
#include <Einheitsvektor.h>
#include <Absolutvektor.h>

class Schiff {
    public:
        Schiff(int schiffId, int schiffLaenge, Absolutvektor absolutvektor, Einheitsvektor einheitsvektor, bool segmentestati[]);
        int schiffId;
        int schiffLaenge;
        Absolutvektor absolutvektor;
        Einheitsvektor einheitsvektor;
        bool segmentestati[] = false;
        // c++ vektor
};

Schiff.cpp:

#include "Schiff.h"

Schiff::Schiff(int schiffId, int schiffLaenge, Absolutvektor absolutvektor, Einheitsvektor einheitsvektor, bool segmentestati[]){
    this -> schiffId = schiffId;
    this -> schiffLaenge = schiffLaenge;
}

现在我在 Schiff 文件中收到以下错误:

类型“Einheitsvektor”必须实现继承的纯虚 方法'Vektor::range'

错误出现六次,在 Schiff.cpp 中出现两次,在 Schiff.h 中出现四次

我不知道为什么要为“Vektor”实现函数,因为这是一个抽象类,而且函数范围有两个不同的用例。

【问题讨论】:

  • 虚函数上的签名需要与实现上的签名相匹配。
  • bool range ();bool range (int richtung); 不是同一个函数。您可能认为您在 Einheitsvektor::range 中覆盖了 Vektor::range,但 C++ 没有。如果您要覆盖函数,请使用 override 关键字。

标签: c++ inheritance abstract-class virtual-functions


【解决方案1】:

Einheitsvektor 中,您需要声明方法range,因为它在母类(Vektor)中。所以它应该是这样的:bool range(){ ... },而不是bool range (int richtung)。如果您希望它有一个参数,您必须在基类中再声明一个接受参数的方法,或者修改当前的方法,使其具有如下参数:virtual bool range(int richtung) const = 0;。你必须对virtual bool range (int x, int y); 做同样的事情(在这种情况下,唯一的选择是声明第二个范围方法,有两个参数,所以你将有一个接受一个参数和一个接受 2 的范围方法)。

class Vektor {
public:
    Vektor();
    virtual bool range(int richtung) = 0 ;
    virtual bool range (int x, int y) = 0;
    virtual ~Vektor();
};

【讨论】:

  • 我也试过class Absolutvektor: public Vektor { public: Absolutvektor(int x, int y); int x; int y; virtual ~Absolutvektor(); virtual bool Vektor::range (int x, int y); };,因为错误说我必须继承方法 Vektor::blabla
猜你喜欢
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多