2012-01-27 25 views
4

C++での継承について少し助けが必要です。私はこのような同じ構造のコードを持っています:C++でのインターフェイスの実装

class IBase { 
public: 
    virtual long Dimensions() = 0; 
}; 

class IShape : public IBase { 
    virtual long Area() = 0; 
}; 

class Rectangle : public IShape { 
private: 
    long x; 
public: 
    long Dimensions() {return x}; 
    long Area() {return x*x}; 
}; 

class Rhombus: public IShape { 
private: 
    long x; 
    long fi; 
public: 
    long Dimensions() {return x}; 
    long Area() {return x*x*sin(fi)}; 
}; 

ご覧のとおり、Dimensions()の実装は両方のクラスで同じです。今、私はこのような何かをするためにwan't:

class BaseImplementation : public IBase { 
protected: 
    long x; 
public: 
    virtual long Dimensions() {return x}; 
}; 

class Rectangle : public IShape, public BaseImplementation { 
public: 
    long Area() {return x*x}; 
}; 

class Rhombus: public IShape, public BaseImplementation { 
private: 
    long fi; 
public: 
    long Area() {return x*x*sin(fi)}; 
}; 

がBaseImplementationからクラスロンバスへのメソッドの寸法()の実装を挿入することは可能ですか?これは、C++標準のいくつかのバージョンでサポートされていますか? Thx。

+0

@CharlesBをそれはインターフェイスの継承を分離し、(デフォルトの実装)インを混合するために、一般的には悪い考えではありません。これはかなり一般的なテクニックです。 –

+0

@ user1173308「メソッドの実装をクラスに挿入する」とは、どういう意味ですか? 'Rhombus'クラスの' Dimensions() 'の動作をオーバーライドしますか? – CharlesB

+0

@ KonradRudolph:ありがとう、私はこれに慣れていない。間違っていたとしてコメントを削除しました。 – CharlesB

答えて

3

でそれをオーバーライドする必要があります。1回IShapeを通じて、一度はBaseImplementationまでVirtual Inheritanceと呼ばれるC++の機能は、そのような状況に対処するように設計されています。あなたはIShapeの継承をIBasevirtual publicにする必要があることに注意してください。

1

Dimensions()BaseImplementationに実装されており、アクセスに少なくともprotectedである場合、それは任意の派生オブジェクトに表示される必要があります。

したがってRhombusBaseImplementationから派生した場合はDimension()関数を使用できます。あなたがRhombusの場合にDimension()ための具体的な実装を持つようにしたい場合は、あなたのDimension()virtualする必要がありますし、あなたの階層に問題があなたのRectangleは今二回IBaseを継承していることであるRhombus

+0

オブジェクトRhombusを作成しようとすると。 GCC(g ++)はこのエラーを示しています:変数 'xyz'を抽象型の 'Rhombus'と宣言できません:以下の仮想関数は 'Rhombus'内で純粋です: – zdenek

0

実装を明示的に挿入する必要はありません。既に継承されているので、 myRhombus-> Dimension()を呼び出すことができます。あなたは、単にそれとの間にある層は、寸法を定義実装することができ

1

class IBase { 
public: 
    virtual long Dimensions() = 0; 
}; 

class IShape : public IBase { 
public: 
    virtual long Area() = 0; 
}; 

class IShapesDefinedDimension : public IShape 
{ 
public: 
    long Dimensions() { return x; } 
protected: 
    long x; 
}; 

class Rectangle : public IShapesDefinedDimension { 
public: 
    long Area() {return x*x;} 
}; 

class Rhombus: public IShapesDefinedDimension { 
public: 
    long Area() {return x*x*sin(fi); } 
... 
    }; 
関連する問題