0

CodeBlocks を使用していますが、コンパイルできない次のコードがあります。

(これはいくつかの C++ の落とし穴に関するものなので、私が聞きたいのはコンパイルできない理由だけです)

コードは次のとおりです。

#include <iostream>
using namespace std;

class Shape
{
        public:
                Shape();
                virtual void reset();
        private:
                int color;
};

class Point : public Shape
{
        private:
        double a,b;
};

void Shape::reset()
{
        cout<<"Shape reset\n";
}

void Point::reset()
{
        Shape::reset();
        cout<<"Point reset";
}

Shape::Shape()
{
        reset();
}

int main()
{
        Shape s;
        Point o;
}

次のエラーが表示されます。

no `void Point::reset()' member function declared in class `Point'
4

2 に答える 2

6

Point関数の宣言をクラス本体に追加する必要があります。

class Point : public Shape
{
public:
    virtual void reset();
private:
    double a,b;
};

(基底クラスでvirtual宣言されているので不要ですがvirtual、念のため追加しておくと便利です。)

于 2012-06-03T18:01:22.287 に答える
0

代わりに、次のように宣言する必要があります。

class Shape
{
       public:
               Shape();
               virtual void reset(){};
       private:
               int color;
};

括弧に注意してください。仮想関数は何もしないため、宣言に括弧を追加するだけです。仮想関数であるため、基底クラスを継承する際に再定義されるように設計されています。Shape::reset()そのため、関数を実際に呼び出すことはできませんPoint::reset()。クラスでもPoint、新しい関数を再定義する必要があります。このような:

class Point : public Shape
{
     public:
         void reset();
}

その後、関数を として使用できますPoint::reset

于 2012-06-03T18:20:26.690 に答える