0

私はポリモーフィズムに不慣れです。これはこれと同様の質問です、解決策は私を助けませんでした。正確なエラーは次のとおりです。

Circle.cpp(34):エラーC2259:'Circle':次のメンバーが原因で抽象クラスをインスタンス化できません:' void Shape ::particle(const Ray&、const int&)':抽象です

私はこれを読み込もうとしましたが、clone()メンバー関数は、Circleのコピーコンストラクターを呼び出して、この状態を新しく作成されたCircleオブジェクトにコピーし、「パーティクル」を初期化しようとします(これはできません)。 )。私が正しい場合:これを修正するにはどうすればよいですか?私が間違っている場合...それは何をしているのか(私は何を間違っているのか)、そしてどのようにそれを修正するのですか?

class Shape {
public:

virtual void particle(const Ray& ray, const int& count) = 0;      
...
virtual Shape* clone()  const = 0;   
private:
vector<Ray>  incoming_ray; 
vector<int>  counts;
};

class Circle : public Shape {
public:
Circle* clone()  const;   //covariant return type
virtual void
particle(const Ray& ray, const int& count);
 ...
};

その後

Circle* Circle::clone()  const { return new Circle(*this); }

void
Circle::particle(const Ray& rays, const int& count){
incoming_ray.push_back(inc_ray);
counts.push_back(counts);};

私は試した

virtual void particle(const Ray& ray, const int& count) const = 0; 
                                                          ^

しかし、それでも同じエラーが発生しましたか?

ありがとう

4

1 に答える 1

3
virtual void particle(const Ray& ray, const int& count) const = 0;
                                                        ^^^^^^

まったく別の方法になります。そして、と同じではありません:

virtual void particle(const Ray& ray, const int& count) = 0;

最終的に、あなたが持っているのは、純粋仮想である派生クラスの新しいメソッドです。これは、基本クラスの純粋仮想メソッドをオーバーライドしません。上書きがないため、派生クラスには実装されていない継承された純粋仮想関数が残り、派生クラスも抽象クラスになります。

Baseクラスの仮想メソッドをオーバーライドするにはBaseクラスのメソッドを完全に同じように定義してオーバーライドする必要があります(ただし、共変型は許可されます)。

于 2012-05-31T10:51:42.827 に答える