0

次のコードはコンパイルされませんが、エラーを理解できません。

#include <iostream>

class FamilyMember {

    int age;
    public:
    virtual int myage () = 0;
};


class Grandfather: public FamilyMember {

    int age;
    public:
    Grandfather (): age(60) {
        std::cout << "Im grandpa" << std::endl;
    }
    ~Grandfather () {
        std::cout << "Oh no! Grandpa is dead!" << std::endl;
    }
    virtual int myage () const {
        return age;
    }
};


class Father: public Grandfather {

    int age;
    public:
    Father (): age(40) {
        std::cout << "Im papa" << std::endl;
    }
    ~Father () {
        std::cout << "Papa is gone, noooooo!" << std::endl;
    }
    virtual int myage () const {
        return age;
    }
};


class Son: public Father {

    int age;
    public:
    Son (): age(20) {
        std::cout << "Im the kid" << std::endl;
    }
    ~Son () {
        std::cout << "Son is dead? He was so young!" << std::endl;
    }
    int myage () const {
        return age;
    }
};

int main () {

    Grandfather G;
    Father F;
    Son S;

   return 0;
}

これが私が得るエラーです(私はコードを壊す最小限の量に切り詰めたので、行番号は一致しません)。

main.cc:535: error: cannot declare variable ‘G’ to be of abstract type ‘Grandfather’
main.cc:161: note:   because the following virtual functions are pure within ‘Grandfather’:
main.cc:157: note:  virtual int FamilyMember::myage()
main.cc:536: error: cannot declare variable ‘F’ to be of abstract type ‘Father’
main.cc:177: note:   because the following virtual functions are pure within ‘Father’:
main.cc:157: note:  virtual int FamilyMember::myage()
main.cc:537: error: cannot declare variable ‘S’ to be of abstract type ‘Son’
main.cc:193: note:   because the following virtual functions are pure within ‘Son’:
main.cc:157: note:  virtual int FamilyMember::myage()
make: *** [main.o] Error 1
Compilation failed.
4

6 に答える 6

6

さまざまな署名。

virtual int myage () = 0;

そして子供クラスで。

virtual int myage () const

作るpure-virtual myage constnon-const、子供でこの機能を作ってください。

于 2012-08-29T11:11:33.533 に答える
1

他のすべての回答で述べられていることに加えて、C++ 11 は、overrideコンパイル時にエラーを指摘する特別な識別を提供します。

class Grandfather: public FamilyMember {

    // as before ...

    virtual int myage () const override {  // Error! Not overriding.
        return age;
    }
};
于 2012-08-29T11:21:27.233 に答える
0

また、各サブクラスに属性を与えるのではなくage、スーパークラスが持つ属性を使用する方が理にかなっています。

class FamilyMember
{
    protected:
        int age;
    public:
        virtual int myage ()  const = 0;
        FamilyMember(int a) : age(a) {}
};

class Grandfather: public FamilyMember
{
    public:
        Grandfather (): FamilyMember(60) {}
        ~Grandfather () {}
        virtual int myage () const { return FamilyMember::age; }
};
于 2012-08-29T11:20:55.453 に答える
0

myage正しくオーバーライドしていません。

virtual int myage () = 0;

と同じではありません

virtual int myage () const

メソッドのconston は、それを別の署名にするため、別のメソッドになります

于 2012-08-29T11:12:20.077 に答える
0

これは、ベースで純粋仮想として宣言されています

 virtual int myage () = 0; 

しかし、派生クラスでは関数プロトタイプは

 virtual int myage () const 

これは別の関数であるため、基本クラスの非 const バージョンはオーバーライドされておらず、コンパイラ エラーがこれを示しています。

于 2012-08-29T11:12:50.787 に答える
0

クラス "FamilyMember" と "Grandfather" の関数 myage は異なるシグネチャを持っています。

仮想 int myage () = 0; // FamilyMember 内

virtual int myage () const // おじいさんの中

クラス FamilyMember の定義を次のように変更してみてください。

int age;
public:
virtual int myage () const = 0;
};
于 2012-08-29T11:14:39.963 に答える