web-dev-qa-db-ja.com

静的仮想関数を使用できますか?そうでない場合、なぜですか?

可能性のある複製:
C++静的仮想メンバー?

静的仮想関数を使用できますか?そうでない場合、なぜですか?

class X
{
public:
       virtual static void fun(){} // Why we cant have static virtual function in C++?
};
53
Jatin

いいえ、C++では意味をなさないためです。

仮想関数は、クラスのポインタ/参照インスタンスへがあるときに呼び出されます。静的関数は特定のインスタンスに関連付けられているのではなく、クラスに関連付けられています。 C++にはクラスへのポインターがないため、静的関数を仮想的に呼び出すことができるシナリオはありません。

71

それは意味がありません。 仮想メンバー関数のポイントは、呼び出されるオブジェクトインスタンスの動的型に基づいてディスパッチされることです。一方、静的関数はどのインスタンスにも関連せず、むしろclassのプロパティです。したがって、それらが仮想であることは意味がありません。必要な場合は、非静的ディスパッチャを使用できます。

struct Base
{
    static void foo(Base & b) { /*...*/ }

    virtual ~Base() { }
    virtual void call_static() { foo(*this); /* or whatever */ }
};

struct Derived : Base
{
     static void bar(int a, bool b) { /* ... */ }

     virtual void call_static() { bar(12, false); }
};

使用法:

Base & b = get_instance();
b.call_static();   // dispatched dynamically

// Normal use of statics:
Base::foo(b);
Derived::bar(-8, true);
15
Kerrek SB