いつか、仮想関数呼び出しをテンプレート化できると思います(おそらくc.l.C++モデレート時)。私は次の行に何か試しました。仮想呼び出しは、純粋仮想メンバーのアドレスを使用します。それは合法ですか?
#include <iostream>
template<class T, class FUN>
void callVirtual(T& t, FUN f){
(*t.*f)();
}
struct Base{
virtual ~Base(){}
virtual void sayHi()=0;
};
struct Derived : public Base{
void sayHi(){
std::cout << "Hi!" << std::endl;
}
};
void Test(){
Base* ptr = new Derived;
callVirtual(ptr,&Base::sayHi);
}
int main()
{
Test();
return 0;
}
Output:
Hi!
コンパイル時に純粋仮想基本メンバーメソッドのアドレスが与えられても、テンプレート化されたメソッドは実行時に正しいメソッドを呼び出します。 標準のC++では、純粋な仮想メンバーのアドレスを取得することは合法ですか?事前
EDIT-1で
ありがとう:は、私は質問の後半部分削除 'どのように動作しませんの?'。それが注目を集めているように見えます。
EDIT-2:私は司会++ c.l.cを検索し、このlink(http://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/5ddde8cf1ae59a0d)に出くわしました。標準はそれを制限していないので、コンセンサスはそうであるように思われます、それは勝利です。
EDIT-3: CodeProjectの記事(ovanesのおかげで)読んだ後、私は、コンパイラは、いくつかの魔法を行うことを考えています。仮想関数はvtable(コンパイラ固有)を介して実装されているため、仮想関数のアドレスを取ると、常にvtableのオフセットが得られます。使用される 'this'ポインタに応じて、適切な関数(アドレスがオフセットにある)が呼び出されます。私は、標準が何も言わないので、これを正当化する方法はわかりません!
感謝。あなたは純粋な仮想へのメンバ関数ポインタを記述するC++標準のセクションを知っていますか?私は見つけようとしましたが、どんな具体的な詳細も解読できませんでした。不完全な型へのメンバポインタが許可されているので、純粋仮想へのメンバポインタも許可されているようです。 – Abhay
質問を誤読しました。私は私の答えを更新します。 –
+1あなたの編集された答えは、この質問に対する「答え」に近づいています:-)。私は、仮想関数(純粋かどうか)を取り上げ、それを呼び出すことは、実装の定義した言語の側面に向かっていると考えるようになっています。 – Abhay