2016-05-11 9 views
3

を再割り当てされています私はこのようなクラスがあるとします。は、仮想関数に法的

struct A{ 
    virtual void someFunc() { } 
}; 

は、それが基本的に関数ポインタを格納するため、これは可能かもしれない....別の関数に仮想関数を再割り当てすることが可能ですクラス内ではvirtualになるようにします。

私はこのような何かことを実現:メンバ関数は、暗黙のパラメータとしてthisポインタを取るため

void aRandomFunc(); 
A mya; 
mya.someFunc = &aRandomFunc; 

はおそらく不可能です。

しかし、メンバー関数を別のメンバー関数に再割り当てすることはできますか?

+0

なぜですか?これを可能にし、それが標準C++かどうか疑問に思うコンパイラを見つけましたか? – juanchopanza

+0

@juanchopanzaちょっと好奇心...まだ実際にコードを書いていない – DarthRubik

+3

"それは基本的にクラス内に関数ポインタを格納しています" - それほどではありません。 Vtable実装は関数ポインタのテーブルへのポインタを格納しますが、そのテーブルはそのクラスのすべてのオブジェクト間で共有されます。 – aschepler

答えて

10

いいえ、機能を再割り当てすることはできません。

しかし、関数ポインタを再割り当てすることはできますが、これは実際に何をしようとしているかによって異なります。 https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem

+0

実行時に抽象的なインタフェース全体を交換する機会を忘れることはありません。状態パターンの実装を提供するのに非常に便利です。 –

3

いいえ、機能を再割り当てすることはできません。

  1. 使用関数ポインタ:

    あなたは、異なる機能の動作を取得するために2つのことを行うことができます。

  2. このクラスから継承し、関数をオーバーライドします。

これらの方法のいずれも問題の洗練された解決策ではない可能性があります。


関数ポインタの例は次のようになります。

struct A{ 
    virtual void (*pSomeFunc)(void); 
}; 

... 

A a; 
a.pSomeFunc = &aRandomFunc; 
a.pSomeFunc(); 

継承の例は次のようになります。

struct AWithDifferentFuncAbility : public A { 
    virtual void someFunc() { 
     //some new functionality; 
    } 
} 
0

あなたがstd::functionを試してみてください、それが何に近い何かをしますあなたが必要です。ここで

は、あなたがこのクラスでそれを行うことができます方法は次のとおりです。

struct A{ 
    std::function<void()> someFunc = []{ /* default implementation */ }; 
}; 

そして、あなたはそれが後である機能をどのように変更することができます

void aRandomFunc(); 
A mya; 
mya.someFunc = &aRandomFunc; 

、あるいは別のラムダに置き換えます

mya.someFunc = []{ /* another function */ };