2010-11-19 14 views
6

仮想と宣言されたクラスメンバ関数への関数ポインタは有効でしょうか?仮想関数へのポインタは依然として仮想的に呼び出されますか?

class A { 
public: 
    virtual void function(int param){ ... }; 
} 

class B : public A { 
    virtual void function(int param){ ... }; 
} 

//impl : 
B b; 
A* a = (A*)&b; 

typedef void (A::*FP)(int param); 
FP funcPtr = &A::function; 
(a->*(funcPtr))(1234); 

B::functionと呼びますか?

+2

コードがあります。これは、コードを実行するだけであなたが答えることができる質問の1つです。 –

+0

IDEよりも早く起動してプロジェクトやコード、コンパイル、デバッグなどを作成するよりも速いので、他の人にもメリットがあり、この質問/コードは失われません。 – uray

+2

@Martin:動作が未定義の場合はどうなりますか? –

答えて

2

はい。また、仮想継承でも動作します。

+2

私はC++を愛しています!!!! – uray

5

はい。 codepadまたはideoneにテストするための有効なコード:あなただけの継承された機能を起動しようとして

class A { 
public: 
    virtual void function(int param){ 
     printf("A:function\n"); 
    }; 
}; 

class B : public A { 
public: 
    virtual void function(int param){ 
     printf("B:function\n"); 
    }; 
}; 

typedef void (A::*FP)(int param); 

int main(void) 
{ 
    //impl : 
    B b; 
    A* a = (A*)&b; 

    FP funcPtr = &A::function; 
    (a->*(funcPtr))(1234); 
} 
0

関数が呼び出されます。

0

そのための最良のテストは、クラスAのメソッドを純粋な仮想メソッドにすることです。両方の場合(純粋な仮想メソッドの有無にかかわらず)、B :: functionが呼び出されます。

関連する問題