C++11 Buch und Polymorphiefrage
-
Ich habe heute im Buchladen zum ersten mal Bücher zu C++11 gesehen.
Das eine war von MuT - Dirk Louis
und das andere von Addison Wesley.Gibt es schon ehrliche Meinungen zu diesen Büchern? Ich muss ohnehin C++ mal gescheit lernen... und suche ein WIRKLICH brauchbares Buch

Das nächste ist eine Frage zur Polymorphie:
ich kenne das bisher nur so:
class Base { foo()...} class Derived: Base{foo()...} Base* x = new Derived(); x->foo() // ruft Derived::foo() aufKann man das ganze auch nur mit Referenzen tun?
-
shisha schrieb:
Kann man das ganze auch nur mit Referenzen tun?
Ja.
-
Ja, aber wieso "nur"?
Edit: es sähe so aus:
#include <iostream> #include <vector> struct Base { virtual void print() { std::cout << "Base print function called!\n"; } }; struct Derived : public Base { void print() { std::cout << "Derived print function called!\n"; } }; int main() { Base* base_ptr(new Derived); Base& base_ref(*new Derived); base_ptr->print(); base_ref.print(); base_ptr->Base::print(); base_ref.Base::print(); delete base_ptr; delete &base_ref; }
-
Hacker schrieb:
shisha schrieb:
Kann man das ganze auch nur mit Referenzen tun?
Ja, aber wieso "nur"?
Weil Zeiger und Referenz eine semantische Gemeinsamkeit haben?
-
Hacker schrieb:
Base& base_ref(*new Derived); delete &base_ref;Ist das Dein ernst? Zeig doch offensichtlichen Anfängern nicht immer so einen Schrott.
-
Tachyon schrieb:
Hacker schrieb:
Base& base_ref(*new Derived); delete &base_ref;Ist das Dein ernst? Zeig doch offensichtlichen Anfängern nicht immer so einen Schrott.
Eine Erklärung, WAS daran Schrott ist, wäre für den offensichtlichen Anfänger nicht verkehrt, damit er die "Fehler" schneller erkennt

-
Das delete erzeugt undefiniertes Verhalten.
-
Hmm, ich habe es mir etwas ausführlicher erhofft...
Also ich lese folgendes:
mit new Derived wir eine neue Derived-Instanz angelegt . Das liefert einen Zeiger zurück, der mittels * dereferenziert wird. Damit wird eine Referenz vom Basistyp initialisiert.
Anschließend wird ein delete aufgerufen mit dem Argument Adresse von base_ref.
Ist diese Adresse nicht die selbe wie vom neu angelegten Objekt?Wie kann man dann das mit new erzeugt Objekt löschen ohne undefiniertes Verhalten zu erzeugen?
-
Tachyon schrieb:
Das delete erzeugt undefiniertes Verhalten.
Ja, wegen dem fehlenden virtuellen Destruktor. Dein Zitat lässt es aber so aussehen, als hätte es was mit den Referenzen zu tun.
-
Bashar schrieb:
Tachyon schrieb:
Das delete erzeugt undefiniertes Verhalten.
Ja, wegen dem fehlenden virtuellen Destruktor. Dein Zitat lässt es aber so aussehen, als hätte es was mit den Referenzen zu tun.
Stimmt, das delete ist okay. Mir war irgendwie so, als wenn Objekte hinter eine Referenz während der Lebenszeit der Referenz gültig bleiben müssen.
-
Mir war irgendwie so, als wenn Objekte hinter eine Referenz während der Lebenszeit der Referenz gültig bleiben müssen.
Nein, nennt sich dann "dangling reference"
Tachyon schrieb:
Stimmt, das delete ist okay.
Jein. Das delete erzeugt kein undefiniertes Verhalten, weil auf die dangling reference hinterher nicht zugegriffen wird. Das delete sorgt auch dafür, dass kein Speicherleck entsteht. Soweit so gut.
ABER: Schon die Zeile 23 mit der Referenz auf das grade eben mit new erzeugte Objekt ist arg unüblich und macht das ebenso arg unübliche delete in Zeile 31 erst nötig. Arg unüblich bedeutet, dass es normalerweise aus guten Gründen unterlassen wird. Einer der Gründe ist in diesem Fall genau der "HÄ?WTF?"-Effekt, den Tachyon erlebt hat (und er ist kein Anfänger).Fazit: Syntaktisch korrekt, Tut was man will, aber ein Stolperstein und Alptraum für jeden, der den Code unbefangen lesen will. Macht man nicht.