1

関数ポインタが定義され、基底クラスに値が割り当てられている場合。そして、それから派生したクラスから関数を呼び出すために使用されなければなりません。どうすればそれをすることができますか?C++:基底クラスで定義された関数ポインタによって派生した関数を呼び出す

Thisは、関数をポインタで呼び出す例を示しています。しかし、これはポインタが使用されているクラスと同じクラスで定義されている場合にのみ機能します。

Thisは、親クラスの関数を呼び出す例を示します。私はこれに類似したものを試しましたが、うまくいかなかったのです。

From derived 
(((Base)this)->*fncPtr)(); 
(((Base)this)->*(Base::fncPtr))(); 

上記の両方が機能しません。私を助けてください。 、Baseのメンバ関数へのポインタにキャスト

void (Derived::*derivedFncPtr)() = &Derived::someMemberFunction; 

まず:

void (Base::*baseFncPtr)() = static_cast<void (Base::*)()>(derivedFncPtr); 

を次に、それを呼び出す:(*thisを仮定することであるDerivedのメンバ関数へのポインタが与えられる

+0

このような場合は、_Template Function Pattern_を関数ポインタよりもうまく使用してください。 –

+0

これは解決策がないことを示唆していますか?テンプレート機能パターンとは別に – PHcoDer

+0

私はそれがより良い、より簡単な解決策であることを示唆しています。 –

答えて

3

は単純に使用します。他の

(this->*fncPtr)(); 

何もする必要はありません。ベース型へのキャストは暗黙的です。したがって、明示的にキャストする必要はありません。

1

BaseダイナミックタイプDerived

(this->*baseFncPtr)(); 
あなたがベース void (Base::*fncPtr)()のメンバ関数へのポインタを持っている場合は、その同じ派生クラスのメンバ関数へのポインタを呼ぶだろうと

Live example

+0

ありがとうございます。しかしここでは、メンバ関数へのポインタもBaseクラスです。 – PHcoDer

+0

あなたは何を意味するのか分かりません。質問を改善できますか? – Oktalist

+0

完了。サンプルコードをもう一度ご覧ください。私は前に例のコードでいくつかのエラーを出しました。 – PHcoDer

1

は、あなたがまったく同じ方法で派生したオブジェクトthisへのポインタでそれを呼び出すことができます。

(this->*fncPtr)(); 

Demo here


(((Base)this)->*fncPtr)(); 

あなたは本当に(これは必須ではありません)したい場合は、明示的にBaseのポインタにthisをキャストすることができますが、これはそれがどのようにではありませんBaseはポインタ型ではありません。これはうまくいく:

((Base*)this)->*fncPtr)(); 

しかし、私が言ったように、キャストは冗長です。

関連する問題