1. ホーム
  2. c++

[解決済み] 未実装の純粋仮想メソッド?

2022-02-17 16:40:12

質問

コンパイル時に、unimplemented pure virtual methodというエラーが何度も出ます。 抽象的な基底クラスの純粋仮想メソッドをすべて実装しています。何かアイデアはありますか?

ここに抽象ベースクラスがあります。

class record{
public:
    virtual int getID()=0;
    virtual record *clone(); 
};

と実装しています。

class sdata: public record{
public:
    sdata(std::string s = ""){data=s; ID=atoi(data.substr(0,8).c_str());}
    virtual int getID(){return ID;}
private:
    std::string data;
    int ID;
};

申し訳ありませんが、以下がエラーメッセージの全文です。

record' に未実装の純粋仮想メソッド 'getID' があります。

おそらく、このコードの一部がエラーを引き起こしているのでしょう。

int hashTable::hash(record *x) {
   return floor(m * (x->getID() * A - floor(x->getID() * A)));
}

解決方法は?

エラーの原因となっているコードを見なければ、何が起こっているのか正確に知ることは困難です。 もしこれがコンパイル時のエラーであるなら、その原因となるようなものはここには見当たりません。

しかし、実行時エラーが発生している場合、考えられる原因としては、以下の2つが挙げられます。

(1) ベースクラスのコンストラクタやデストラクタの内部からメンバ関数を呼び出す(間接的でも可)。

(2) 派生クラスが、ベースクラス版の関数を実装せずに呼び出すこと。

この両方のエラーを示す例としては、次のようなものがあります。

struct Base {
    Base()
    {
        call_foo(); // Oops, indirectly calls Base::foo() (Scenario 1)
    }
    void call_foo() const {
        foo();
    }
protected:
    virtual void foo() const = 0;
};

struct Derived : Base { protected: virtual void foo() const { Base::foo(); // Oops, unimplemented virtual base function (Scenario 2) } };

int main() { Derived().call_foo(); }

== UPDATE: コンパイル時のエラーの可能性があります。

あなたのサンプルコードでは、recordに純粋仮想でないclone()メンバ関数があり、そのメンバ関数は record * . レコードは抽象的なものなので、レコードを直接作成することはできません(具象的なサブクラスのみ)。 このことから、clone()メンバ関数もおそらく純粋仮想関数であるべきであることがわかります。 return new record() この場合、ベースクラスが純粋仮想関数を持っているというエラーが発生します。