Sicher stellen, dass abgeleitete Methode verwendet wird?
-
Hallo!
Ich habe in etwa folgende Sache vor:CBase** array=new CBase*[n]; array[0]=new CChild(); array[1]=new CChild2(); //etc... for(int i=0;i<n;i++) array[i]->doSomething();//Bitte nur bei Bedarf CBase::doSomething()Wie stelle ich sicher, dass doSomething() die Methoden der abgeleiteten Klasse benutzt? z.B. gibt es CChild::doSomething(), aber nicht CChild2::doSomething(), wo dann natürlich CBase::doSomething() aufgerufen werden muss. Im Moment würde ja immer CBase::doSomething aufgerufen werden, oder?
Gibt es einen cast, der mir automatisch die unterste Ebene castet, also automatisch auf CChild oder CChild2?
Danke!
Viele Grüße
Sören
-
virtual
-
die methoden virtuel machen
je nach objekt tpy wird die entsprechende methoden aufgerufen
-
Also, so?:
class CBase { ... virtual void doSomething() } class CChild:public CBase { ... virtual void doSomething() }... und es funzt?
Vielen Dank!
Sören
-
Das "sicherste":
class foo { public: inline void bar() { bar_impl(); } private: virtual void bar_impl() { printf("foo\n"); } }; class foo2 : public foo { private: virtual void bar_impl() // bar_impl überschreiben... { printf("foo2\n"); } };
-
kein printf in c++

-
hustbaer schrieb:
Das "sicherste":
nicht sicherer oder unsicherer. Der Vorteil liegt eher darin, dass wir Dinge mit verschiedenen Funktionen (Deklaration eines polymorphen Interfaces [naja... polymorphes Verhalten an sich lässt sich in C++ nicht deklarieren...] in Form von bar() bzw. ein Implementationsdetail in Form einer virtuellen Funktion) getrennt haben,
-
"Sicher" deswegen weil dadurch von aussen keiner mehr die Möglichkeit hat die Version einer bestimmten Klasse aufzurufen, da
- Nur die "oberste" Klasse in der Hierarchie die "bar" Funktion hat und
- Die "bar_impl" Funktion überall private ist.
Dadurch kann ich nichtmehr "p->fooN::bar_impl();" schreiben und damit die falsche Funktion erwischen, und wenn ich "p->fooN::bar();" schreibe macht es nix, weil es nur eine Implementierung gibt, die dann immer virtual die eigentliche Funktion aufruft.
"Sicher" also in dem Sinn dass man dadurch "misuse" von aussen verhindern kann.
-
hustbaer schrieb:
"Sicher" deswegen weil dadurch von aussen keiner mehr die Möglichkeit hat die Version einer bestimmten Klasse aufzurufen
Naja, aber so was passiert doch nicht aus Versehen.
...
-
und bitte mach den destructor der basisklasse virtual. siehe scott meyers
-
finix schrieb:
hustbaer schrieb:
"Sicher" deswegen weil dadurch von aussen keiner mehr die Möglichkeit hat die Version einer bestimmten Klasse aufzurufen
Naja, aber so was passiert doch nicht aus Versehen.
...
Threadtitel schrieb:
Sicher stellen, dass abgeleitete Methode verwendet wird?
???
Huh?
Was Du woll?