Tja gegen Container hab ich in diesem Fall auch was einzuwenden:
So wie das jetzt geschrieben ist kann ich 'liste' schlecht kopieren: Die Zeiger werden zwar alle kopiert, zeigen jedoch immernoch auf die selben Objekte.
Ich frage mich, wo da der Unterschied zu deiner Implementation ist. Du kopierst doch auch nur die Zeiger, nachdem du das Feld vergrößert hast. Wenn ich ein neues Objekt in meine Liste speichern will, schreibe ich einfach
|
C-/C++-Quelltext
|
1
|
liste.push_back (neues_objekt);
|
und gut ist. Dabei überlasse ich es der Liste, sich selbst zu vergrößern und muss das nicht umständlich selbst machen.
Der Konstruktor der Basisklasse soll eine virtuelle Memberfunktion aufrufen, die natuerlich die entsprechene Fkt. der Subklasse sein soll. Geht das irgendwie?
Klar geht das, wenn man weiss, was man tut.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
class FooBase
{
FooBase ()
{
foo ();
}
virtual void foo () = 0;
};
class Foo : public FooBase
{
Foo ()
: FooBase ()
{
}
virtual void foo ();
};
int main ()
{
new FooBase (); // Compiler-Fehler, weil foo () abstrakt
new Foo (); // Erzeugt ein Foo-Objekt und Foo::foo () wird im FooBase Konstruktor benutzt
}
|
Wäre Foo::foo () nicht abstrakt, würden beide Objekte erzeugt, nur dass im ersten Fall eben FooBase::foo () benutzt wird.
Fazit: Es gibt keine "virtuellen Konstruktoren," weil bei Erzeugung von Objekten bekannt sein muss, welchen Typ sie haben.
Jedoch dürfen dafür die zu überladene Funktione nicht inline sein. Das hier wird also nicht korrekt funktionieren:
virtual void sprich(void){out("foo!");} <- Da inline nicht korrekt überladbar
Falsch. Man kann generell jede Methode überladen, egal ob sie nun inline ist, oder nicht. inline ist nur eine Hilfe für den Compiler, dass es wünschenswert ist, für die Methode keinen Aufruf zu generieren, sondern den Quelltext an der benutzten Stelle einzubetten. Der Compiler muss das aber nicht so machen. Virtuelle Methoden werden so gut wie niemals inline expandiert.
MfG
Rainer