ALlgemeine Fragen zu C++
-
Hi,
folgende Fragen:Was macht "virtual" und für was ist "protected", ist es sicherer als "prvate"
und wozu ist das ": public bar::foobar" ? Bsp:class x : public bar::foobar { public: x(); virtual ~x(); protected: virtual void foobar(); }
-
Nur mal auf die Schnelle:
Sehr knapp gesagt: Damit kannst du "steuern" welche Funktionen abgeleitete Klassen haben müssen.
Über protected/public/private kannst du die Ableitungshirarchien kontrollieren.
Mit "Sicherheit" hat das so direkt nichts zu tun.
Im Beispiel heisst das: Die Klasse x erbt die Funktion/Variable foodbar der Klasse bar.
Je nachdem, was foodbar in der Klasse bar ist (private/protected/public), ist es auch in der Klasse x dann private/protected/public...Aber kauf dir am besten mal ein Buch.... Das sind Fragen, die man nicht in 5 Minuten vollkommen erklären kann...
-
stimmt nicht ganz. wenn eine methode virtual ist, muss sie nicht implementiert werden.
Das bedeutet, dass die funktion implementiert werden muss.
virtual type func(param1, paramn) = 0;
protected bedeutet ganz einfach, dass abgeleitete klassen diese variablen benutzen dürfen, aber man trotzdem nicht wie bei private von außen drauf zugreifen darf.
-
Was macht "virtual"
virtual ist wichtig für Vererbung. Wenn du eine Klasse a hast und eine Methode foo in der Klasse und nun erzeugst du eine Klasse b, die public von Klasse a erbt und du willst die Methode foo aendern, also überschreiben. Das geht nur, wenn die Funktion in der Klasse a virtual deklariert wurde.
#include <iostream> struct a { virtual void foo() { std::cout << "a::foo" << std::endl; } }; struct b { virtual void foo() { std::cout << "b::foo" << std::endl; } }; int main() { a *ptr=new b; a->foo(); }
und für was ist "protected", ist es sicherer als "prvate"
nein, protected sorgt dafuer, dass Abgeleitete Klassen auf protected Member zugreifen können, gegenüber anderen Methoden sind die Member aber geschützt.
class foo { int a; //s ist private protected: int baz(int b) { return a=b; } //baz ist protected public: int car() const { return a;; } //car ist public }; struct bar : public foo { int barz() { a=1; } //das geht nicht, da a private ist int bart() { return baz(0); } //das geht, da baz protected ist int barm() const { return car(); } //das geht, da car public ist }; int main() { foo foz; foz.a=1; //geht nicht, da foo private ist foz.baz(2); //geht nicht, da foo protected ist int i=foz.car(); //geht, da foz public ist }
und wozu ist das ": public bar::foobar" ?
das sorgt dafür, dass die Klasse von der Klasse foobar im Namespace (oder der Klasse/Struktur) bar geerbt wird.
btw. du solltest dein C++ Buch nochmal kontaktieren zu dem Thema Vererbung etc. (du hast doch ein C++ Buch? ansonsten schaue hier
http://www.c-plusplus.net/bucher.php
http://www.c-plusplus.net/tutorials.htm
http://www.schornboeck.net/ckurs/index.htm
http://www.mindview.net/Books/TICPP/ThinkingInCPP2e.html
)
-
gibbets2000 schrieb:
stimmt nicht ganz. wenn eine methode virtual ist, muss sie nicht implementiert werden.
Das bedeutet, dass die funktion implementiert werden muss.
Na wenn das mal keine Aussage ist
. Nochmal kurz... Wenn eine Funktion pure virtual ist macht das die Klasse zu einer abstrakten Klasse. Das bedeutet, du kannst erst Instanzen erstellen wenn du von dieser Klasse erbst und die pure virtual Funktionen implementierst. Die instanziierung einer abstrakten Klasse ist nicht möglich.
-
kingruedi schrieb:
virtual ist wichtig für Vererbung. Wenn du eine Klasse a hast und eine Methode foo in der Klasse und nun erzeugst du eine Klasse b, die public von Klasse a erbt und du willst die Methode foo aendern, also überschreiben. Das geht nur, wenn die Funktion in der Klasse a virtual deklariert wurde.
Das stimmt so nicht ganz. Man kann Memberfunktionen auch überschreiben, wenn sie nicht virtuell sind.
Der Sinn von virtual ist, Polymorphie zu ermöglichen. Der Aufruf einer nicht-virtuellen Memberfunktion wird zur Compilezeit anhand des statischen Typs der linken Seite des . oder -> Operators aufgelöst. Der Aufruf einer virtuellen Memberfunktion wird dagegen erst zur Laufzeit aufgelöst, und zwar anhand des dynamischen Typs.
class A { public: virtual void vfunktion(); void nvfunktion(); }; class A : public B { virtual void vfunktion(); void nvfunktion(); }; int main() { B b; A& a = b; a.nvfunktion(); // statischer Typ ist A, es wird also A::nvfunktion aufgerufen b.nvfunktion(); // statischer Typ ist B, es wird B::nvfunktion aufgerufen a.vfunktion(); b.vfunktion(); // der dynamische Typ ist in beiden Fällen B, es wird // also zweimal B::vfunktion aufgerufen }
-
Man kann Memberfunktionen auch überschreiben, wenn sie nicht virtuell sind.
Nein kann man nicht. Zumindest solange man zugesteht, dass wir uns hier im Standard-C++ Forum befinden in dem "überschreiben" eine fest definierte Bedeutung hat. Nicht-virtuelle Memberfunktionen können immer nur überdeckt, niemals aber überschrieben werden.
Hört sich nach Haarspalterei an, ist es imo aber nicht. In C++ sind die Regeln für Überladen, Überschreiben und Verdecken von Natur aus schon recht kompliziert, wenn da jetzt noch die Begriffe durcheinander fliegen wird's hoffnungslos.
-
Der Fachausdruck ist IMHO override, was irgendwie nur so ähnlich klingt wie overwrite -- hat sich die deutsche C++-Autorengemeinde auf überschreiben eingeschossen? OK von mir aus, dann nehm ich den Satz zurück, und ersetze ihn durch die Bemerkung, dass jemand, der nicht weiß was virtuelle Memberfunktionen sind, überhaupt nicht in der Lage ist, überdecken und überschreiben auseinanderzuhalten.
Dazu kommt, dass überschreiben und überdecken keine sprechenden Bezeichnungen sind (überschreiben ist genau genommen sogar irreführend), und ohne Kenntnis der einschlägigen Definitionen sowieso nicht verstanden werden. Da trägt der Kontext mehr Bedeutung: überdecken bezieht sich schließlich immer auf nichtvirtuelle, überschreiben immer auf virtuelle Memberfunktionen. IMHO käme daher überhaupt nichts durcheinander, jedenfalls nicht mehr als vorher, wenn man die Begriffe verwechseln oder gleich vereinheitlichen würde.
-
Der Fachausdruck ist IMHO override, was irgendwie nur so ähnlich klingt wie overwrite -- hat sich die deutsche C++-Autorengemeinde auf überschreiben eingeschossen?
Override heißt meines Wissens nach sowas wie "aufheben". Trotzdem wird es soweit ich weiß eigentlich überall (inklusive in deutschen Newsgroups) als "überschreiben" verwendet. Begründet wird das damit, dass quasi der Eintrag in der vmt "überschrieben" wird. Die Adresse des "final overriders" wird in die vmt eingetragen und "überschreibt" alle vorherhigen Einträge des entsprechenden slots (das gilt so vereinfacht natürlich nur für SI).
überdecken bezieht sich schließlich immer auf nichtvirtuelle, überschreiben immer auf virtuelle Memberfunktionen.
Das verstehe ich jetzt nicht. Genau auf diesen Unterschied wollte ich doch hinaus.
-
HumeSikkins schrieb:
überdecken bezieht sich schließlich immer auf nichtvirtuelle, überschreiben immer auf virtuelle Memberfunktionen.
Das verstehe ich jetzt nicht. Genau auf diesen Unterschied wollte ich doch hinaus.
Ich wollte auf den jeweiligen Kontext hinaus: Wenn ich sage, eine nichtvirtuelle Memberfunktion wird überschrieben, mag das fachlich nicht ganz korrekt sein, aber es kann keinen Zweifel geben, was da gemeint ist. Das "nichtvirtuell" trägt die Bedeutung, nicht das "überschreiben/decken".