0

次のようなユースケースがあります

Class foo {

public:

  static std::string make(std::string a) { .. }

}

fooを抽象基本クラスにしたいのですが、仮想関数を静的にすることはできないため、makeをこの抽象ベースに含めることはできません。

このような

Class foo {

public:
   static virtual std::string make (std::string) = 0; //error this cannot be done 

}

Class fooImpl: foo{

public:
   std::string make(std::string a) { ..}
}

抽象クラスでメソッドを非静的にするか、派生クラスに静的メソッドを持たせることは、設計の観点から優れたアプローチです。

4

3 に答える 3

3

デストラクタを純粋仮想関数にすることができます。

クラスfoo{
  公衆:
    仮想〜foo()= 0;
}

とにかく、デストラクタの実装を提供することを確認する必要があります。

foo ::〜foo(){}

編集:
したがって、派生できるクラスがありますが、それ自体をインスタンス化することはできません。

于 2008-12-24T08:19:17.800 に答える
1

他の人が投稿したように、メソッドが仮想か静的かという問題があります。

ポリモーフィズムは、参照の種類に関係なく、特定のオブジェクト インスタンスの動作を呼び出すという考えに基づいています。

base& somefunction(); // may return base or derived objects
base &b = somefunction();
b.method();

ここで、メソッドの動作がベースから派生に変更され、参照している実際のインスタンスの動作が必要な場合は、ポリモーフィズムと仮想メソッドが必要です。メソッドがメンバー データを使用するかどうかは関係ありません。重要な部分は、特定のインスタンスにバインドされた動作であるということです。

一方、静的メソッドはクラスにバインドされます。つまり、参照されているインスタンスの動作ではなく、扱っているクラスの動作です。そのため、上記の構文を使用できる場合でも、処理しているクラスがクラスbaseであるため、静的メソッドが呼び出されます。

ドメインに関する深い知識がなければ、扱っている設計オプションのいずれかが他のものよりも優れていると判断する理由はありません。上記の理由があなたの決断に役立つことを願っています。

于 2008-12-24T09:57:06.680 に答える
0

静的関数を非静的仮想関数でラップすると、インスタンスがある場合はポリモーフィズムが可能になり、インスタンスがない場合は静的呼び出しが可能になります (インスタンスがない場合にのみポリモーフィズムが必要になるユースケースは考えられません)。実例)。静的仮想の実装を派生クラスに入れるのを忘れると、コンパイル時エラーが発生し、あまりきれいではありませんが、他にできることはあまりありません。この見落としがC0x規格で修正されていないのは残念ですが、比較的狭い要件なので需要はないと思います

于 2008-12-24T12:47:18.960 に答える