12

基本クラスと派生クラスがあり、他の関数に静的として渡す必要があるため、それらを静的に保ちながら基本関数を変更したいと考えています。

どうやってやるの?

4

7 に答える 7

26

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として知られており、静的ポリモーフィズムの実装に使用できます。

于 2011-06-10T21:31:25.923 に答える
3

静的関数へのポインターが必要ですが (たとえば、静的関数へのポインターを必要とする別の関数に引数として渡すため)、その関数ポインターに仮想的にアクセスする必要があるということですか? その場合、仮想関数を使用して関数ポインターを取得します。

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());
于 2011-06-09T10:27:49.920 に答える
2

静的関数には、アクセスするためのインスタンスがないため、仮想にすることはできません。私はあなたがそれらを上書きできると信じています。

于 2011-06-09T10:12:27.190 に答える
1

C++で静的仮想関数を使用することはできません。

于 2011-06-09T10:13:11.107 に答える
1

this仮想関数は通常、実行時に呼び出される関数のタイプを決定するためにポインターに 依存しています。

静的メンバー関数は渡されないthisため、静的仮想関数はC++では許可されていません。

于 2011-06-09T10:16:16.863 に答える
0

私があなたの質問を理解するのに正しければ、あなたは次のアプローチに従うことができます、さもなければ無視してください。

基本クラスに静的関数ポインタがあります。

基本クラスには静的関数があります(静的関数ポインターを使用して関数を呼び出します)。

派生クラスでは、静的関数ポインタを実行したい関数定義uに設定します。(基本クラスでは、uは関数ポインタをデフォルトの関数に設定できます)。

于 2011-06-09T10:16:41.503 に答える
-1

静的仮想関数を持つことは意味がないため、静的仮想関数を持つことはできません。

于 2011-06-09T10:16:03.840 に答える