Problem mit privaten virtualen Funktionen
-
Warum ist folgendes Program korrekt? Ich verstehe es nicht
#include <stdio.h> class A{ public: virtual void CallMe(); }; class B:public A { private: //note--> private here void CallMe(); }; class C: public B { void CallMe(); }; void A::CallMe() { printf ("Test A!\n"); }; void B::CallMe() { printf ("Test B!\n"); }; int main (int argc, char * argv[]) { A *ptr=new B; ptr->CallMe(); }
-
Die Methode CallMe() in A ist virtuell.
Durch die Klassendefinitionclass B : public A{ [...] }
werden alle public member von A an B vererbt. B ist ein A.
Die Methode CallMe() wird für B explizit definiertvoid B::CallMe() { [...] }
Somit wird die Funktionalität von B erweitert.
Holst du dir jetzt einen pointer auf ein A Objekt mit dem Konstruktor von B
ist das ok, weil B ein A ist.
Rufst du nun die Methode CallMe() aufptr->CallMe();
dann zeigt ptr auf ein B Objekt und die Methode B::CallMe() wird aufgerufen.
Hoffe, das hilft dir weiter..
-
dann zeigt ptr auf ein B Objekt und die Methode B::CallMe() wird aufgerufen.
Du hast recht. Das kann ich natuerlich verstanden. Aber B::CalMe ist ene private Funktion.
-
Moinsen!
Die virtuelle Methode in A ist aber public!
Du implementierst diese jedoch erst in B. Dann ist es egal ob sie in B public oder private ist, da du ja den pointer auf ein A Objekt hast!Schau da mal rein : http://mindview.net/Books/TICPP/ThinkingInCPP2e.html
Stichwort : late binding oder Kapitel 15greetins
-
btw : benutze lieber
std::cout << "text here" << std::endl;
anstelle von
printf("text here");
Je schneller man sich das an/ab gewöhnt desto leichter/übersichtlicher wirds...
-
Aber es gibt kein gutes Ersatz fuer printf/sprintf in C++. Nur CString::Format in Visual C++
-
Aber es gibt kein gutes Ersatz fuer printf/sprintf in C++.
Was genau ist denn an Cout nicht gut? Für die seltenen Fälle, die du printf wirklich brauchst, kannst du das natürlich benutzen.
-
CarstenJ schrieb:
Für die seltenen Fälle, die du printf wirklich brauchst, kannst du das natürlich benutzen.
Nein, da nimmt man boost::format
-
> boost::format
Ist es im C++ Standart?
-
itman schrieb:
> boost::format
Ist es im C++ stan****?Jein. Im C++ Standard ist es nicht enthalten, aber boost (www.boost.org) ist quasi Standard
-
Nein, da nimmt man boost::format
Wenn mans denn zur Verfügung hat...
-
Shade Of Mine schrieb:
itman schrieb:
> boost::format
Ist es im C++ stan****?Jein. Im C++ Standard ist es nicht enthalten, aber boost (www.boost.org) ist quasi Standard
uups, denn es leichter ist ein Wrapper mit snprintf zu schreiben
-
Was die Formatierung betrifft, kann man in einigen Faellen die Flags von ios_base und die Manipulatoren verwenden.
-
CarstenJ schrieb:
Nein, da nimmt man boost::format
Wenn mans denn zur Verfügung hat...
Warum sollte man boost nicht installieren können?
Mal von embedded Systemen abgesehen.
-
Wieso sollte man boost installieren, wenn man auch printf verwenden kann?
Ihr immer mit eurem Overkill ...
-
dEUs schrieb:
Wieso sollte man boost installieren, wenn man auch printf verwenden kann?
Ihr immer mit eurem Overkill ...
Weil boost::format sicherer ist - und auch mit UDTs läuft?
Oder willst du etwa printf("Hallo %s!", str.c_str());
schreiben?
Und für jeden UDT ein toString() schreiben?Wozu gibt es denn dann streams?
Welchen Overkill hat boost denn? Ausser dass du es einmal installieren musst (was keine 30 Minuten dauert)? Und das ist nun wirklich nicht so zeitintensiv - und du bekommst auch noch die smart pointer - die ja wirklich wichtig sind.
btw: wozu C++ verwenden wenn man C verwenden kann, bzw. wozu C verwenden wenn man ASM verwenden kann, bzw. wozu ASM verwenden wenn ich direkt die opcodes schreiben kann,...
-
Shade Of Mine schrieb:
Weil boost::format sicherer ist - und auch mit UDTs läuft?
Oder willst du etwa printf("Hallo %s!", str.c_str());
schreiben?
Und für jeden UDT ein toString() schreiben?Ich weiss ncihtmal was UDT sein soll!
Shade Of Mine schrieb:
Wozu gibt es denn dann streams?
Gute Frage. Wozu gibt es sie denn, wenn sie niemand verwendet, sondern lieber ne dritte Lib?
Shade Of Mine schrieb:
Welchen Overkill hat boost denn? Ausser dass du es einmal installieren musst (was keine 30 Minuten dauert)? Und das ist nun wirklich nicht so zeitintensiv - und du bekommst auch noch die smart pointer - die ja wirklich wichtig sind.
Der Overkill besteht darin, dass man sich ne neue Lib installiert ("nur" 30 Minuten Aufwand), wenn man nur eine einzige Funktion aus ihr braucht (Die man im Grunde garnicht benötigt, da man printf verwenden kann). Man muss sich auch in diese Lib erst einarbeiten, egal, wie supertoll die jetzt aufgebaut sein mag. Und SmartPointer habe ich bisher noch nie gebraucht. Und flouser garantiert auch nicht. Wozu also soll er sie installieren?
Shade Of Mine schrieb:
btw: wozu C++ verwenden wenn man C verwenden kann, bzw. wozu C verwenden wenn man ASM verwenden kann, bzw. wozu ASM verwenden wenn ich direkt die opcodes schreiben kann,...
Wie ich es hasse, wenn du immer übertreiben musst
-
Und was das Beispiel angeht, ist es in Ordnung, weil
" Access control (clause 11) is not considered in determining overriding."
In Java ist es anders.
-
dEUs schrieb:
Shade Of Mine schrieb:
Weil boost::format sicherer ist - und auch mit UDTs läuft?
Oder willst du etwa printf("Hallo %s!", str.c_str());
schreiben?
Und für jeden UDT ein toString() schreiben?Ich weiss ncihtmal was UDT sein soll!
User defined type.
dEUs schrieb:
Shade Of Mine schrieb:
Wozu gibt es denn dann streams?
Gute Frage. Wozu gibt es sie denn, wenn sie niemand verwendet, sondern lieber ne dritte Lib?
Du musst sie auch mit boost::format verwenden. Das sind zwei verschiedene Dinge.
dEUs schrieb:
Shade Of Mine schrieb:
Welchen Overkill hat boost denn? Ausser dass du es einmal installieren musst (was keine 30 Minuten dauert)? Und das ist nun wirklich nicht so zeitintensiv - und du bekommst auch noch die smart pointer - die ja wirklich wichtig sind.
Der Overkill besteht darin, dass man sich ne neue Lib installiert ("nur" 30 Minuten Aufwand), wenn man nur eine einzige Funktion aus ihr braucht (Die man im Grunde garnicht benötigt, da man printf verwenden kann). Man muss sich auch in diese Lib erst einarbeiten, egal, wie supertoll die jetzt aufgebaut sein mag. Und SmartPointer habe ich bisher noch nie gebraucht. Und flouser garantiert auch nicht. Wozu also soll er sie installieren?
printf ist aber deutlich unbequemer und fehlerträchtiger. Einarbeiten musst du dich, das stimmt, so wie du dich in printf einarbeiten musst. Und als ich früher vor vielen Jahren mal in Basic programmiert habe, habe ich auch keine Klassen "gebraucht". Inzwischen weiß ich sie aber sehr zu schätzen. Genauso isses bei dir mit den Smartpointern. und was flouser sind, weiß ich nicht.
dEUs schrieb:
Shade Of Mine schrieb:
btw: wozu C++ verwenden wenn man C verwenden kann, bzw. wozu C verwenden wenn man ASM verwenden kann, bzw. wozu ASM verwenden wenn ich direkt die opcodes schreiben kann,...
Wie ich es hasse, wenn du immer übertreiben musst
[/quote]
Wieso: Programmieren in C++ ist doch nur bequemer und weniger Fehleranfällig, als in ASM, genauso wie das verwenden von boost nur bequemer und weniger Fehleranfällig ist, als ohne. Der Vergleich ist doch wunderbar.
-
'flouser' bin nur ich!!