C++ Ableitungsproblem:

Hallo,

ich habe folgendes Problem, wobei ich hier erst einmal den Quelltext gleich angeben werde:

Es gibt eine Basisklasse Base, die eine virtuelle Methode (protected) init hat.
Desweiteren gibt es eine Klasse A, welche alle Methoden von Base (inklusive der virtuellen Methode) init erbt und diese Methode init überschreibt (auch virtuell).

Im Base Konstruktor wird init aufgerufen.
Ich dachte jetzt, da init virtuell ist, somit bei der Instanziierung von A automatisch die Methode A::init aufgerufen wird.

Doch erst einmal die Quellcodes (insg 5 Teile)

– base.h ----------------------------------
#ifndef BASE_H
#define BASE_H

class Base {
public:
Base();
virtual ~Base();
virtual void init();
};

#endif

– base.cpp --------------------------------
#include
#include „base.h“

Base::Base(){
this->init();
}
Base::~Base(){
}

void Base::init(){
cout

class A : public Base {
public:
A();
virtual ~A();
virtual void init();
};

#endif

– a.cpp -----------------------------------
#include
#include „a.h“

A::A() : Base() {
}

A::~A(){
}

void A::init(){
cout
#include

#include „base.h“
#include „a.h“

int main(int argc, char** argv){
cout init();
b->init();

return EXIT_SUCCESS;
}

Die Ausgabe ist dann:

Hello, World!
Base::init()
Base::init()
Base::init()
A::init()

Ich möchte aber gerne folgendes haben:
Base::init()
A::init()
Base::init()
A::init()

Irgendwie hab ich Bohnen auf den Augen (nach 10 Stunden vor dem Rechner auch kein Wunder :wink: )

Hoffe hier weiß jemand Rat.

MfG
Frank

Hallo,

ich habe folgendes Problem, wobei ich
hier erst einmal den Quelltext gleich
angeben werde:

Es gibt eine Basisklasse Base, die eine
virtuelle Methode (protected) init hat.
Desweiteren gibt es eine Klasse A, welche
alle Methoden von Base (inklusive der
virtuellen Methode) init erbt und diese
Methode init überschreibt (auch
virtuell).

Im Base Konstruktor wird init aufgerufen.
Ich dachte jetzt, da init virtuell ist,
somit bei der Instanziierung von A
automatisch die Methode A::init
aufgerufen wird.

[Rest gelöscht!]

Offensichtlich kann ich mit meinem Compiler (egcs 1.1.2 unter Linux 2.2.10 (Suse 6.2)) aus einem Konstruktor nicht virtuelle Methoden korrekt aufrufen. Es wird nicht über die Virtuelle Methoden Tabelle (VMT) gegangen sonder die Methode wird direkt aufgerufen (vermute ich aus der Ausgabe zu schließen).

In der Bibel (Stroustrup, C++) hab ich dazu auf die schnelle nichts gefunden.

Meine Fragen also:

  • Kann man virtuelle Funktionen aus Konstruktoren aufrufen?
  • Und wenn nein, wie kann ich dies unter Umständen doch machen?
  • Wird die VMT erst am Ende des Konstruktors angelegt?

MfG
Frank