2012-05-01 3 views
-2
#include <iostream> 

using namespace std; 

class base 
{ 
public: 
    virtual void taunt() = 0; 
    virtual void hide() = 0; 
}; 

template <int nx, int ny> 
class derivedA : public base 
{ 
    void hide(); 
public: 
    void taunt() { cout << "derivedA" << endl; } 

    char c[nx][ny]; 
}; 

template <int nx, int ny, int nz> 
class derivedB : public base 
{ 
    void taunt(); 
public: 

    void hide() { cout << "hide B" << end; } 
    char c[nx][ny][nz]; 
}; 

int main() 
{ 
    derived * dp = new derivedA(); 

    dp->taunt(); 

    delete dp; 

    DerivedB b; 

    dp = &b; 

    dp->hide(); 

    return 0; 
} 

AとBはどちらも純粋な仮想クラスベースから派生し、どちらも実装されていない1つのメソッドを持っています。 1つのメソッドを実装しないままにしておくことは合法ですか? 1つのメソッドを実装しないままにしておくことは、受け入れられるか、または良い習慣ですか?より良い方法がありますか?メソッドを実装しないままにしておくことは合法で、良い方法ですか?

編集: 私はクラスがベースから派生していないことに気付きました。私はそれがそうするようにコードを変更しました。

+7

* "AとBはどちらも純粋な仮想クラスベースから派生しています" * - いいえ、そうではありません。彼らはどちらも根拠がない。 –

+1

未完成の単一のメソッドでもクラスをインスタンス化することはできません。ランダムなコンパイラで試してみると、コンパイルエラーが表示されます。 –

+0

'derived * dp = new derivedA();': 'derived'は型ではなく、' derivedA() 'は不正です:' derivedA <4, 5>() ' – hmjd

答えて

5

純粋仮想メソッドを持つクラスから派生し、そのメソッドを派生クラスでオーバーライドしない場合、その派生クラスも抽象クラスになります。これが可能ならば、それはあなたにとっては良いでしょう(例えば、それをさらに引き出すなど)。 derivedAderivedB両方は、スタンドアロンのクラスです:あなたはは、あなたがあなたの例では、あなたが抽象baseクラスから派生していないことを、すべての純粋な抽象メソッド

注意を上書きする必要がありますよりも、その派生クラスをインスタンス化したくない場合

class derivedA : public base { 
    //... 
}; 
1

純仮想メンバ関数を持つクラスをインスタンス化することはできません。もちろんにはというクラスがありますが、そのインスタンスはすべて、純粋仮想すべてに定義されたサブクラスでなければなりません。

関連する問題