Wenn ich eine virtuelle Funktion foo()
zuerst in einer Basisklasse definiert B
und dann in einer abgeleiteten Klasse überschrieben D
, wie kann ich die Adresse B::foo
in einem Zeiger-to-Mitgliedsgeschäft -Funktion in einer Weise, dass beim Aufruf, würde sich der Anruf als eine qualifizierte ID-Aufruf (wie pd->B::foo()
) verhalten?Qualified-id Anruf an Basisfunktion über Zeiger
Beispiel:
struct B {
virtual int foo() { return 1; }
};
struct D: public B {
virtual int foo() { return 2; }
};
int main(int argc, char * argv[]) {
D* pd = new D();
int (B::*pf)() = &B::foo;
int r = (pd->*pf)();
return 0;
}
Dies würde D::foo()
nennen. Kann ich pf
auf eine Weise initialisieren, dass die (pd->*pf)()
B::foo()
aufrufen würde, selbst wenn der dynamische Typ pd
eine Klasse ist, die foo()
überschreibt?
(Bevor jemand fragt, ich will das nicht wirklich tun, ich bin nur neugierig, wenn es möglich ist.)
Cheap hack: 'int (* fp) (B &) = [] (B & b) {return b.B :: foo(); }; ' –