Пожалуйста, рассмотрите следующий код.
#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();
}
Этот код рекурсивно вызывает один и тот же метод B::f
, пока не выйдет из стека, в то время как я хотел бы, чтобы метод call
вызывал A::f
. То есть он должен называть это статически, как обычно, если бы я просто написал:
struct B : public A {
virtual void f() {
std::cout << "B::f" << std::endl;
// ...
A::f();
// ...
}
};
Причина, по которой я хочу использовать метод call
, состоит в том, чтобы разложить некоторый код до и после «статического вызова», который является общим для нескольких методов с такой же сигнатурой, как f
...
Как статически вызвать виртуальную функцию, определенную во время выполнения?