Betrachten Sie den folgenden C++ Code:Zeiger auf virtuelle Elementfunktionen. Wie funktioniert es?
class A
{
public:
virtual void f()=0;
};
int main()
{
void (A::*f)()=&A::f;
}
Wenn ich denke, müsste, würde ich sagen, dass & A :: f in diesem Zusammenhang "die Adresse der A-Implementierung von f()" bedeuten würde, da es keine explizite Trennung zwischen Zeigern zu regulären Mitgliedsfunktionen und virtuellen Mitgliedsfunktionen gibt. Und da A f() nicht implementiert, wäre das ein Kompilierungsfehler. Es ist jedoch nicht.
Und nicht nur das. Der folgende Code:
void (A::*f)()=&A::f;
A *a=new B; // B is a subclass of A, which implements f()
(a->*f)();
wird tatsächlich B :: f aufrufen.
Wie passiert das?
Weil der Compiler es möglich macht! Wenn das Aufrufen einer normalen Methode nicht anders ist als das Aufrufen einer virtuellen Methode, warum ist der Code bei der Verwendung von Methodenzeigern anders? Was denkst du, übersetzt der Compiler normale Methoden (virtuelle und ordingliche) Aufrufe? –