2013-01-31 13 views
13

私はいくつかのommitiedコードで明らかに純粋な仮想関数のないC++抽象クラス?

class ShapeF 
{ 
public: 
    ShapeF(); 
    virtual ~ShapeF(); 

    inline void SetPosition(const Vector2& inPosition) { mPosition.Set(inPosition); } 

protected: 
    Vector2 mPosition; 
} 

基底クラスを持っているが、あなたはポイントを得ます。 私はテンプレートとしてこれを使用すると、いくつかの楽しみ(ommited)列挙、私は

class RotatedRectangleF : public ShapeF 
{ 
public: 
    RotatedRectangleF(); 
    virtual ~RotatedRectangleF(); 
protected: 
    float mWidth; 
    float mHeight; 
    float mRotation; 
} 

を使用している形状の種類を決定する方法でShapeFは、その位置での仕事、そして何を定義する列挙型を行いますタイプはです。 アクセッサとミューテータはありますが、メソッドはありません。

ShapeFを抽象クラスにして、誰もShapeF型のオブジェクトをインスタンス化しないようにすることはできますか?

通常は、これはしかし、私は現在、別々のクラスの衝突を扱っていますShapeF

//ShapeF.h 
virtual void Collides(const ShapeF& inShape) = 0; 

内純粋仮想関数を持つことでなんとかです。 私はすべてを上に移動することができますが、純粋な仮想関数なしでクラス抽象化する方法があるのだろうかと思います。

+0

...将来的には、すぐに痛みになります使用してみてください。私はデザインを再考するだろう。 –

+0

@DavidRodríguez-dribeas私はこれが最も簡単なアプローチであると考えていました。私が再設計したければ、ShapeF()をすべて削除し、すべての多形性を持たせ、それぞれの形を自分の人にします。別の提案がない限り? – MintyAnt

答えて

39

あなたが宣言し、、純粋仮想デストラクタを実現することができます。

class ShapeF 
{ 
public: 
    virtual ~ShapeF() = 0; 
    ... 
}; 

ShapeF::~ShapeF() {} 

それはあなたがすでに持っているものから小さなステップだし、直接インスタンス化されることからShapeFを防ぐことができます。派生クラスは変更する必要はありません。

+3

簡単な質問 - '〜ShapeF'は'純粋仮想 'として宣言されているときになぜ実装される必要がありますか? –

+0

ありがとう、これは完全に動作します。なぜこの作品が好きですか?純粋な仮想を定義することはできません。 – MintyAnt

+4

これを定義する必要があります。そうしないと、派生クラスは基本クラスを破棄できません。任意の純粋な仮想関数を定義することができます。これにより、派生したクラスを委譲することができます。 –

18

protectedコンストラクタあなたが(列挙型)および鋳造タギングで動的ディスパッチを再実装しようとしている

+0

+1、デストラクタは 'protected'で、非仮想でなければなりません。 'ShapeF'が' new'-edで、決して 'delete'-dではない場合には、問題を解決できないコーナーケースがあります(それ自体ではバグです)。 –

+0

@DavidRodríguez-dribeasデストラクタを保護する理由?保護されている場合、オブジェクトを削除することはできません。 –

+0

@JamesKanze:私は*すべきことは、強い言葉です。私は、デストラクタが '仮想的である 'という唯一の理由は、その型が導出されることを意図している場合に常にデストラクタを仮想化するという勧告に従うことです。デストラクタを 'protected 'にすることは、同じ基本的な問題を解決し、インスタンス化しないという問題(少なくともスタックやヒープではメモリリークに満足していない限り)の解決策を提供します:)いずれにしても、 (私は質問へのコメントで言及したように) –

関連する問題