2

せずに抽象クラスを作成します。それらのインスタンスを作成しないようにするために、私は、クラスAとB抽象クラスを作りたい私は3つのクラス、A、B、およびC持つ抽象メソッド

class A 
{ 
/// Some Code 
}; 

class B : public A 
{ 
/// Some Code 
}; 

class c : public B 
{ 
/// Some Code 
}; 

を、しかし、これら2つのクラスのどちらも抽象メソッドを持っていません。抽象メソッドがなくてもクラスを抽象化する方法はありますか?

+4

純粋な仮想デストラクタを作成します。または、保護されたコンストラクタのみを許可する。 –

+0

あなたはクラス継承をまったく必要としない可能性があります。代わりにHAS-A関係を考慮する。 –

答えて

2

サンプルコードに示すようにクラスを基本クラスとして使用している場合は、仮想デストラクタが必要です。また、デストラクタはメソッドなので、これを純粋な仮想( "抽象")デストラクタにして、クラス自体を抽象的にすることができます。次のコードを使用することができますので、実装はまだ、純粋仮想メソッドに提供することができることを

注:オブジェクトを破壊したときに、基本クラスのデストラクタは、常に呼ばれているので

class A 
{ 
    public: 
    virtual ~A() = 0; 

/// Some Code 
}; 

class B : public A 
{ 
    public: 
    virtual ~B() = 0; 

/// Some Code 
}; 

class C : public B 
{ 
    public: 
    virtual ~C() = 0; 

/// Some Code 
}; 
A::~A() { } 
B::~B() { } 
C::~C() { } 

を、派生クラスのデストラクタで明示的に基本クラス実装を呼び出す必要はありません。

これはあなたに望ましい効果を与えるはずです。しかし、私は現在、このデザインの魅力的なアプリケーションを考え出すのに苦労しています。 C++の抽象クラスの全目的は、インターフェイスを定義することです。そのインターフェイスを構成するメソッドが定義されていない限り、インターフェイスを持つことはできません。私はちょうど十分に巧みではないか、あるいはあなたのデザインを考え直すべきです。

+0

なぜCのデストラクタを純粋な仮想としても作ったのですか? –

+0

'C 'が抽象ではないと仮定すると、純粋仮想である必要はありません。それはあなたの質問からはっきりしなかった、@roey。また、仮想デストラクタを使って基本クラスを継承するときに 'virtual'がデストラクタに暗示されている間、私はそれを明快にするためにとにかくインクルードするのが好きです。 –

関連する問題