C++ Ableitungsproblem:
(Autor: F r a n k L i n d e c k е, Frage gestellt am So, 12. Sep 1999)
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 <iostream>
#include "base.h"
Base::Base(){
this->init();
}
Base::~Base(){
}
void Base::init(){
cout << "Base::init()" << endl;
}
-- a.h -------------------------------------
#ifndef A_H
#define A_H
#include <base.h>
class A : public Base {
public:
A();
virtual ~A();
virtual void init();
};
#endif
-- a.cpp -----------------------------------
#include <iostream>
#include "a.h"
A::A() : Base() {
}
A::~A(){
}
void A::init(){
cout << "A::init()" << endl;
}
-- main.cpp --------------------------------
#include <iostream.h>
#include <stdlib.h>
#include "base.h"
#include "a.h"
int main(int argc, char** argv){
cout << "Hello, World!" << endl;
Base *a, *b;
a = new Base();
b = new A();
a->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 ;-) )
Hoffe hier weiß jemand Rat.
MfG
Frank
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 <iostream>
#include "base.h"
Base::Base(){
this->init();
}
Base::~Base(){
}
void Base::init(){
cout << "Base::init()" << endl;
}
-- a.h -------------------------------------
#ifndef A_H
#define A_H
#include <base.h>
class A : public Base {
public:
A();
virtual ~A();
virtual void init();
};
#endif
-- a.cpp -----------------------------------
#include <iostream>
#include "a.h"
A::A() : Base() {
}
A::~A(){
}
void A::init(){
cout << "A::init()" << endl;
}
-- main.cpp --------------------------------
#include <iostream.h>
#include <stdlib.h>
#include "base.h"
#include "a.h"
int main(int argc, char** argv){
cout << "Hello, World!" << endl;
Base *a, *b;
a = new Base();
b = new A();
a->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 ;-) )
Hoffe hier weiß jemand Rat.
MfG
Frank
Artikelbaum anzeigen
Re: C++ Ableitungsproblem (Anmerkung)
(Autor: F r а n k L і n d е с k e, Antwort nach 13 h, 17 Min)
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!]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.
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
Du kannst auf diesen Artikel nicht antworten.
Dieser Artikelbaum ist im Archiv des Experten-Forums von wer-weiss-was zum Thema "Programmierung allgemein" archiviert. Es handelt sich um keine aktuelle Diskussion, daher kann auf die Artikel nicht mehr geantwortet werden.
Folgende Artikel könnten Dich auch interessieren:
[C++] Seltsames Problem mit HeaderdateiEigene Klasse included und Programm crasht
dynamic_casts und Basisklassenpointer
Probleme mit Strukturen
Problem mit virtueller Funktion
Improper use of typedef und Function call missing
mciSendString Problem
C++ Destruktor fuehrt zu Segfault
Problem mit mail Programm
Probleme mit 'new' bei OOP
Warum erfolgt in C++ diese Ausgabe?
c++ Anfänger mit drei Fragen
vorheriger Artikelbaum
(Delphi 2: OnClick-Ereignis)
(Delphi 4: INI-Dateien beschreiben)
nächster Artikelbaum















