web-dev-qa-db-ja.com

仮想静的メソッドを使用できますか? (c ++)

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

仮想静的メソッド(C++)を使用できますか?私は次のコードをコンパイルしようとしました:

#include <iostream>
using namespace std;

class A
{
public:
    virtual static void f() {cout << "A's static method" << endl;}
};

class B :public A
{
public:
    static void f() {cout << "B's static method" << endl;}
};

int main()
{
    /* some code */
    return 0;
}

しかし、コンパイラはそれを言う:

member 'f' cannot be declared both virtual and static

だから答えはノーだと思いますが、なぜですか?

おかげで、ロン

40
Ron_s

いいえ。クラス内の関数のstaticは、関数が操作対象のオブジェクトを必要としないことを意味します。 virtualは、実装が呼び出し元オブジェクトのタイプに依存することを意味します。静的には呼び出しオブジェクトがないため、同じ関数でstaticvirtualの両方を使用することは意味がありません。

52

オブジェクトAがなくてもA::F();を呼び出すことができるため、これが可能だとは思わないでください。仮想オブジェクトと静的オブジェクトを作成すると矛盾が発生します。

4
RvdK

クラスにはthisポインターがないためです。仮想関数ルックアップテーブルがあります。簡単なグーグルで、仮想関数ルックアップテーブルの詳細を確認できます。

2
EnabrenTane

いいえ、static関数はグローバル関数に似ていますが、クラスの名前空間内にもあります。 virtualは、派生クラスでの継承と再実装を意味します-「グローバル」関数を再実装することはできません。

1
ks1322