次のコードを考慮してください。ファンクションポインタを使用して仮想関数を静的に呼び出す
#include <iostream>
#include <memory>
struct A {
A() {}
virtual void f() {
std::cout << "A::f" << std::endl;
}
private:
A(const A&);
};
struct B : public A {
virtual void f() {
std::cout << "B::f" << std::endl;
call(&A::f);
}
private:
void call(void (A::*aMethod)()) {
// ...
(static_cast<A&>(*this).*aMethod)();
//(static_cast<A>(*this).*aMethod)(); -> not allowed to copy!
// ...
}
};
void main() {
std::auto_ptr<B> b (new B);
b->f();
}
それはスタックを使い果たすまで、私はA::f
を呼び出すcall
方法をしたいと思いながら、このコードでは、再帰的に、同じB::f
メソッドを呼び出します。つまり、通常、私は単純に書かれていた起こると、それは静的にそれを呼び出す必要があり、次のとおりです。
struct B : public A {
virtual void f() {
std::cout << "B::f" << std::endl;
// ...
A::f();
// ...
}
};
私はcall
メソッドを持ちたい理由は共通である「静的呼び出し」の前と後にいくつかのコードを考慮することですf
と同じシグネチャを持ついくつかの方法に...
は、どのように私は、静的実行時に決定した仮想関数を呼び出すことができますか?
'B :: f'では、なぜ' call'と関数ポインタを通して関数を呼び出さなければなりませんか?どうしてあなたは 'A :: f();'を実行できませんか? (「前」と「後」のコードをいくつかの一般的な関数または共通のクラスにリファクタリングする) –
これはおそらく私がしなければならないことです...メソッド 'call'はコードを取り除くためだけにありましたが、 –