Bitte beachten Sie den folgenden Code eines Überladene:virtueller Funktionsaufruf Auflösung
class Abase{};
class A1:public Abase{};
class A2:public A1{};
//etc
class Bbase{
public:
virtual void f(Abase* a);
virtual void f(A1* a);
virtual void f(A2* a);
};
class B1:public Bbase{
public:
void f(A1* a);
};
class B2:public Bbase{
public:
void f(A2* a);
};
int main(){
A1* a1=new A1();
A2* a2=new A2();
Bbase* b1=new B1();
Bbase* b2=new B2();
b1->f(a1); // calls B1::f(A1*), ok
b2->f(a2); // calls B2::f(A2*), ok
b2->f(a1); // calls Bbase::f(A1*), ok
b1->f(a2); // calls Bbase::f(A2*), no- want B1::f(A1*)!
}
Ich bin daran interessiert zu wissen, warum C++ den Funktionsaufruf in der letzten Zeile zu lösen wählt durch Upcasting die this
Zeiger des Objekts an die Basis Klasse, anstatt das Argument der f()
upcasting? Gibt es irgendeine Möglichkeit, dass ich das gewünschte Verhalten bekomme?
Danke - wie ich es verstehe, ist der Punkt, dass die Auflösung, die virtuell f() aufgerufen wird, zur Kompilierzeit geschieht, basierend auf dem Argument, das an f() übergeben wird. In der letzten Zeile hat der Compiler bereits entschieden, dass f (A2 *) aufgerufen wird. Die aufgerufene Version von f (A2 *) hängt dann davon ab, auf welchen Laufzeittyp verwiesen wird. Da die Klasse B1 f (A2 *) nicht übersteuert, wird hier die Basisklassenversion aufgerufen. – stw
@stw, absolut richtig. –