基本クラスと派生クラスがあり、他の関数に静的として渡す必要があるため、それらを静的に保ちながら基本関数を変更したいと考えています。
どうやってやるの?
基本クラスと派生クラスがあり、他の関数に静的として渡す必要があるため、それらを静的に保ちながら基本関数を変更したいと考えています。
どうやってやるの?
ATL フレームワークは、基本クラスをテンプレートにして、派生クラスにテンプレート パラメーターとしてクラス型を渡すことにより、仮想静的がないという制限を回避します。次に、基本クラスは、必要に応じて派生クラスの静的を呼び出すことができます。次に例を示します。
template< class DerivedType >
class Base
{
public:
static void DoSomething() { DerivedType::DoSomethingElse(); }
};
class Derived1 : public Base<Derived1>
{
public:
static void DoSomethingElse() { ... }
};
class Derived2 : public Base<Derived2>
{
public:
static void DoSomethingElse() { ... }
};
これはCuriously recurring template patternとして知られており、静的ポリモーフィズムの実装に使用できます。
静的関数へのポインターが必要ですが (たとえば、静的関数へのポインターを必要とする別の関数に引数として渡すため)、その関数ポインターに仮想的にアクセスする必要があるということですか? その場合、仮想関数を使用して関数ポインターを取得します。
typedef void (*function)();
void do_stuff_with_function(function);
struct Base {
virtual ~Base() {}
virtual function get_function() = 0;
};
struct Derived : Base {
function get_function() {return my_function;}
static void my_function();
};
Derived d;
do_stuff_with_function(d.get_function());
静的関数には、アクセスするためのインスタンスがないため、仮想にすることはできません。私はあなたがそれらを上書きできると信じています。
C++で静的仮想関数を使用することはできません。
this
仮想関数は通常、実行時に呼び出される関数のタイプを決定するためにポインターに 依存しています。
静的メンバー関数は渡されないthis
ため、静的仮想関数はC++では許可されていません。
私があなたの質問を理解するのに正しければ、あなたは次のアプローチに従うことができます、さもなければ無視してください。
基本クラスに静的関数ポインタがあります。
基本クラスには静的関数があります(静的関数ポインターを使用して関数を呼び出します)。
派生クラスでは、静的関数ポインタを実行したい関数定義uに設定します。(基本クラスでは、uは関数ポインタをデフォルトの関数に設定できます)。
静的仮想関数を持つことは意味がないため、静的仮想関数を持つことはできません。