2011-08-29 17 views
34

可能性の重複:
C++ static virtual members?仮想静的メソッドを使用できますか? (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 

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

おかげで、クラスの機能に ロン

答えて

47

static機能がオン動作するオブジェクトを必要としないことを意味します。 virtualは、実装が呼び出し元オブジェクトの型に依存することを意味します。 staticの場合、呼び出しオブジェクトはないので、staticvirtualの両方を同じ関数 に持つことは意味がありません。

2

クラスにthisポインタがないためです。仮想関数のルックアップテーブルがあります。高速なGoogleでは、仮想関数のルックアップテーブルについて詳しく説明しています。

4

オブジェクトAを持たないでA::F();と呼ぶことができるので、これは考えられません。 仮想と静的にすると矛盾が生じます。

+3

Aha、staticは* thisが存在しないことを意味し、virtualはメソッドにthisポインタがあることを意味します。両者を組み合わせると矛盾が生じます。よかった、ありがとう –

1

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

関連する問題