1

仮想メソッドを持つ抽象基本クラスがあります。派生クラスでは、このメソッドが実装されています。ただし、そのクラスのオブジェクトをインスタンス化せずに関数を呼び出せるようにするために、派生クラスの関数を静的メソッドとして使用したいと考えています。

class Base 
{
   virtual double Foo(double rParam) const;
};

class Derived1 : public Base
{
   static double Foo(double rParam);
};

class Derived2 : public Base
{
   static double Foo(double rParam);
};

基本的に、Derived1 と Derived2 は静的関数 (オブジェクト データに依存しない) の異なる実装を提供しますが、基本クラスの他の関数でそれらの関数を呼び出せるようにするために、これらの関数を仮想化する必要があります。私が現在見ている唯一の解決策は、派生クラスに 2 つのメンバー関数を実装することです。1 つは基本クラスの仮想関数で、もう 1 つは (別の名前で) 静的関数です。ソース コードの二重化を防ぐために、仮想関数は静的関数を直接呼び出すことができます (インライン化することができます)。他の解決策はありますか?

class Derived : public Base
{
   double Foo(double rParam)const
   {
       return FooStatic(rParam);
   }

   inline static double FooStatic(double rParam);
};
4

2 に答える 2

0

仮想メソッドを静的にすることは意味がありません。仮想とは、オブジェクトのタイプに基づいて実行する実装を選択することを意味します。静的コンテキストでは、オブジェクトはありません。

編集: 最初の例はコンパイルされますが、期待どおりに動作しません。静的メソッドは基本実装をオーバーライドするのではなく、非表示にします。つまり、基本クラスの代わりに静的メソッドが呼び出されることはありません。2番目の例は問題ありませんが、問題はありません。

于 2013-08-29T15:18:08.890 に答える