2012-04-29 5 views
4

との競合が問題の原因である:上記2クラスから継承したクラス、同じ関数プロトタイプで、私はここでは、レイトレーシングのタスクに取り組んでいますお互い

class Geometry 
{ 
    public: 
     virtual RayTask *intersectionTest(const Ray &ray) = 0; 
}; 

class Sphere : public Geometry 
{ 
    public: 
     RayTask *intersectionTest(const Ray &ray); 
}; 

class BoundingVolume 
{ 
    public: 
     virtual bool intersectionTest(const Ray &ray) = 0; 
}; 

class BoundingSphere : public Sphere, BoundingVolume 
{ 
    public: 
     bool intersectionTest(const Ray &ray) // I want this to be inherited from BoundingVolume 
     { 
      return Sphere::intersectionTest(ray) != NULL; // use method in Sphere 
     } 
}; 

ソースは、エラー情報をコンパイルすることはできません:

error: conflicting return type specified for ‘virtual bool BoundingSphere::intersectionTest(const Ray&)’ 
error: overriding ‘virtual RayTask Sphere::intersectionTest(const Ray&) 

私は球にメソッドを使用してBoundingSphere :: intersectionTestを実装したいので、私はBoundingVolumeと球の両方から継承する必要があります。同じ戻り値の型を持つ同じパラメータリストを持つ関数を継承するため、ものが混乱してしまいます。

私は同じ機能を持つコードを複製したくありません... 私に解決策を与えることができますか? ..

+0

異なる返品タイプを使用することによってのみ行うことはできません。メソッドのシグネチャはメソッド名とそのパラメータの数と型です。ここでは両方とも同じです。 – DumbCoder

+0

ありがとう...関数名を変更する必要があります... – Tim

+0

constなどの修飾子もメソッドシグネチャの一部を構成します – EdChum

答えて

1

コンパイラは、異なる戻り型の2つの仮想メソッドをオーバーライドしようとしていますが、これは許されません。コンパイラは、戻り値の型がわからない場合、ありますか? 2つのメソッドは同じ名前を持つことはできません。より適切な意味に変更してみてください。

これらの名前が両方のアクションの意味を最もよく表していると感じる場合は、階層構造を慎重に検討することをお勧めします。球形のBoundingVolumeは本当にSphereですか?おそらくそうではありません:Sphere(私的継承、あなたの問題を解決しません)という形で実装されているか、Sphere(構図は、この単純なケースではあなたの問題を解決するでしょう)を持っています。しかし、後者の場合は、BoundingSphereにすべてのメソッドがSphereになるようにする複雑なクラスの移動に問題が発生する可能性があります。または、おそらく、BoundingVolumesと通常のGeometryを区別する必要がありますか?

この問題のもう1つの解決策は、適切なバージョンを呼び出すKoenigルックアップ(引数の型)を使用して、これらの階層の1つに非メンバ関数を使用することです。私はあなたの階層がどのように見えるかを本当に知らないと言うことはできません。しかし、あなたの設計を考慮してください:同じ名前の操作を持っていれば、全く異なる意味論的結果を戻すことができます。

+0

ありがとうございます!私のデザインが私の必要性に適しているかどうかを思い出させます。 'BoundingVolume'と' Geometry'は互いに区別し、 'Sphere'を使って' BoundingSphere'を実装する方がより合理的です。 – Tim

関連する問題