-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つのメソッドを実装しないままにしておくことは許容できますか、それとも良い習慣ですか?より良い方法はありますか?

編集:クラスがベースから派生していないことに気づきました。コードを変更しました。

4

2 に答える 2

5

純粋仮想メソッドを持つクラスから派生し、派生クラスでそのメソッドをオーバーライドしない場合、その派生クラスも抽象クラスになります。これがあなたにとって問題ない場合(例えば、あなたはそれをさらに導き出すでしょう)、あなたはそれをすることができます。その派生クラスをインスタンス化する場合、すべての純粋な抽象メソッドをオーバーライドする必要があります。

あなたの例では、抽象baseクラスから派生していないことに注意してください。両方ともderivedAスタンドアロンderivedBクラスです。必要なもの:

class derivedA : public base {
  //...
};
于 2012-05-01T17:14:14.283 に答える
1

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

于 2012-05-01T17:13:41.617 に答える