Anfängerfrage: Referenz + Polymorphie



  • Hallo,

    ich hoffe, dass in diesem Forum auch Anfängerfragen gestellt werden dürfen. Als langjähriger "Java Softie" habe ich endlich mal wieder die Muse, aus der heilen VM-Welt auszubrechen und mich mit C++ zu befassen. Doch nun zu meiner Frage:
    Polymorphie findet ja bei C++ ja nur in Verbindung mit Zeigern oder Referenzen statt. Weshalb gilt dies aber nicht für eine Neuzuweisung einer Referenz? Mich würde insbesondere auch interessieren was unter der Haube stattfindet.
    Beispiel:

    #include <iostream>
    
    class A {
    public:
    	A() {
    	}
    	virtual void doIt() {
    		std::cout << "A" << std::endl;
    	}
    };
    
    class B: public A {
    public:
    	B() {
    	}
    	void doIt() {
    		std::cout << "B" << std::endl;
    	}
    };
    
    void callDoIt(A& a) {
    	a.doIt();
    }
    
    int main(int argc, char **argv) {
    	A a;
    	B b;
    	A* p = &a;
    	p-> doIt(); // gibt A aus - ok
    	p = &b;
    	p->doIt(); // gibt B aus - ok
    	A& ref = a;
    	ref.doIt(); // gibt A aus - ok
    	ref = b;
    	ref.doIt(); // gibt auch A aus - weshalb?
    	callDoIt(a); // gibt A aus - ok
    	callDoIt(b); // gibt B aus - ok - weshalb klappt Polymorphie in diesem Fall?
    }
    

    Weshalb wird bei

    ref.doIt()
    

    nicht B ausgegeben und weshalb wird Polymorphie angewandt, wenn es sich bei der Referenz um einen formalen Parameter handelt?

    Grüße
    Felix



  • Eine Referenz kann nur einmal initialisiert werden.

    Mit

    A& ref = a;
    

    bindest du sie an ein Objekt des Typs A.

    ref = b;
    

    Macht dann nichts anderes als dem Objekt a die entsprechenden Werte des Objekts b zuzuweisen.

    Die Referenz selbst wird nicht an das Objekt b gebunden. Wie gesagt, das ist nur einmal bei der Initialisierung möglich.



  • Ok. Verstehe. Das heißt also, dass sich eine Referenz nach ihrer Initialisierung genauso wie jede andere "normale" Variable verhält, oder?
    Was macht denn der Compiler intern, wenn eine Referenz initialisiert wird? Ich habe bisher immer nur gelesen, dass eine Referenz intern irgendwie auch mit einem Zeiger arbeitet, allerdings nirgends konkretes gefunden.



  • _felixxx schrieb:

    Das heißt also, dass sich eine Referenz nach ihrer Initialisierung genauso wie jede andere "normale" Variable verhält, oder?

    Ja, bis auf die Polymorphie eben.

    _felixxx schrieb:

    Ich habe bisher immer nur gelesen, dass eine Referenz intern irgendwie auch mit einem Zeiger arbeitet, allerdings nirgends konkretes gefunden.

    Die Implementierung des c++ Standards ist selbst nicht standardisiert, d.h. der Compilerhersteller kann dir nur sagen, was da intern genau passiert. Es dürfte allerdings üblich sein die Referenz als Zeiger zu implementieren und alle Objektzugriffe anzupassen (Z.B. Umwandlung von a.foo() in a->foo() usw.)


Anmelden zum Antworten