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