2017-07-19 7 views
1

base(B)クラスのポインタが(polymorphism-ly)基本クラス?インスタンス(Base *)が親関数(Base :: f())をオーバーライドするかどうかをチェックする

class B{ 
    public: int aField=0; 
    virtual void f(){}; 
}; 
class C : public B{ 
    public: virtual void f(){aField=5;}; 
}; 
class D: public B{}; 

int main() { 
    B b; 
    C c; 
    D d; 
    std::vector<B*> bs; 
    bs.push_back(&b); 
    bs.push_back(&c); 
    bs.push_back(&d); 
    for(int n=0;n<3;n++){ 
     //std::cout<<(bs[n]->f)==B::f<<std::endl; 
     //should print "true false true" 
    } 
} 

私はB::fに対して関数ポインタbs[n]->fのアドレスを比較してみましたが、それは互換性のないです。

Demo

私はこの質問が重複する可能性があることを感じて、私は(申し訳ありません)を見つけることができません。

+0

ここで何をしようとしていますか?これは好奇心のため、[X Yの問題](https://meta.stackexchange.com/q/66377/218012) – Justin

+0

@Justinのようです。私はそれが可能かどうかを知りたいと思う...それは最適化のいくつかのまれなケース(私はそれが必要になる場合)に役立つかもしれません。 – cppBeginner

+0

質問はあまり意味がありません。 'bs [n] - > f 'は常に仮想呼び出しです –

答えて

2

GCC has an extension仮想メンバー機能のアドレスを取得できます。あなたはthis QAが面白いことを見つけるかもしれ

#include <vector> 
#include <iostream> 

class B{ 
    public: int aField=0; 
    virtual void f(){}; 
}; 
class C : public B{ 
    public: virtual void f(){aField=5;}; 
}; 
class D: public B{}; 

int main() { 
    B b; 
    C c; 
    D d; 
    std::vector<B*> bs; 
    bs.push_back(&b); 
    bs.push_back(&c); 
    bs.push_back(&d); 
    for(int n=0;n<3;n++){ 
     // This might need to be: (void*) B{}.*&B::f == (void*) (...) 
     std::cout << ((void*) &B::f == (void*)(bs[n]->*&B::f)) << '\n'; 
    } 
} 

Demo

これには、同じように使用することができます。

もちろん、これは非標準的な動作です。あなたは、標準C++に似た行動を望んでいた場合、あなたが実際に純粋仮想機能を探しているかもしれない。そうでなければ

class B{ 
    public: int aField=0; 
    virtual void f() = 0; 
}; 

、あなたはf()に、このようなbool戻り値の型として通信するために、いくつかの他のメカニズムを、持っている必要があるだろう。

関連する問題