Bitte beachten Sie den folgenden Code. Eine virtuelle Funktion über einen Funktionszeiger statisch aufrufen
#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();
}
Dieser Code rekursiv ruft die gleichen B::f
Verfahren, bis es aus Stapel läuft, während ich die call
Methode möchte A::f
zu nennen. Das heißt, es sollte es statisch nennen, wie es normalerweise geschehen hätte, würde ich einfach geschrieben:
struct B : public A {
virtual void f() {
std::cout << "B::f" << std::endl;
// ...
A::f();
// ...
}
};
Der Grund, warum ich die call
Methode haben will, ist einigen Code vor und nach dem ‚statischen Aufruf‘ Faktor, der gemeinsam ist zu mehreren Methoden mit der gleichen Signatur wie f
...
Wie kann ich eine virtuelle Funktion statisch aufrufen, die zur Laufzeit entschieden wird?
In 'B :: f', warum müssen Sie die Funktion über' Call' und einen Funktionszeiger aufrufen? Warum kannst du nicht einfach 'A :: f();'? (Refactoring der "Vorher" und "Nachher" -Code in einige gemeinsame Funktionen oder eine gemeinsame Klasse.) –
Das ist wahrscheinlich, was ich tun muss ... Methode 'Call' war nur hier, um den Code herauszufiltern, aber ich hatte nicht realisiert Ich könnte es nicht so verwenden, wie ich es wollte ... –