πŸš€ go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: de.comp.lang.c++
Article #587

Re: Wiedermal: Virtuelle Methoden

#587
From: Juergen Kraemer
Date: Mon, 16 Oct 1995 14:30
68 lines
2531 bytes
Hallo!

Roman 'RoB' Bartke (rob@robot.mayn.de) wrote:
: Meine lieben VIRTUosen!
:
: Gegeben sei folgender Programmrumpf, bei dem das Verhalten der 
: ShowError-Methode des Clients durch Vererbung modifiziert werden soll.
: Das Connect() simuliert hierzu immer einen Fehler.
:
:
: c.cc:
: ------------------------------------------------------------------------
: #include <iostream.h>
:
: class Client
: {
: public:
: 	Client() { Connect(); }
: 	virtual ~Client() { }
: 	void Connect() { ShowError(); }
: protected:
: 	virtual void ShowError() { cerr << "Client::ShowError()\n"; }
: };
:
: class SpecialClient : public Client
: {
: public:
: 	SpecialClient():Client() { }
: protected:
: 	void ShowError() { cerr << "SpecialClient::ShowError()\n"; }
: };
:
: int main(int argc, char *argv[])
: {
: 	SpecialClient client;
: 	client.Connect();
: 	return 0;
: }
: ------------------------------------------------------------------------
:
: "g++ -Wall -o c c.cc -lg++; c" liefert:
: Client::ShowError()
: SpecialClient::ShowError()
:
: Ich hΓ€tte hier
: SpecialClient::ShowError()
: SpecialClient::ShowError()
: erwartet, da es beidemale um einen SpecialClient ging.
:
: Warum ruft der Konstruktor nicht die neue virtuelle Methode auf, 
: sondern noch die alte? 

: Das ist im Beispiel tragisch, da der Konstruktor bei neudefinierten
: virtuellen Methoden nicht automatisch "connecten" darf...

Die Klasse "Client" kann keine virtuellen Funktionen von "SpecialClient"
aufrufen. Die virtuellen Funktionen einer Klasse werden in der sogenannten
'Virtual Methods Table' (VMT) abgelegt. Diese Tabelle wird vom Konstruktor
der entsprechenden Klasse angelegt. Bei einer abgeleiteten Klasse werden,
wie Dein Beispiel auch zeigt, die Konstruktoren der Basisklassen vor
demjenigen der abgeleiteten aufgerufen. Das bedeutet, dass die VMT der
abgeleiteten Klasse zu diesem Zeitpunkt noch nicht erzeugt worden sein
kann und daher den Basisklassen unbekannt sein muss. Literatur dazu gibt
es z.B. von Stroustrup, Lippman und einigen anderen, wahlweise auf Deutsch
oder Englisch.

mfg
Juergen
Technical Details
Message-ID: <45tq9a$pbg@news.rhrz.uni-bonn.de>
Path: arc1-ca.pugleaf.net!news.rhrz.uni-bonn.de!asl2!jkr
References: <45qosk$t10@robot.mayn.de>

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!news.rhrz.uni-bonn.de!asl2!jkr
From: jkr@asl2 (Juergen Kraemer)
Newsgroups: de.comp.lang.c++
Subject: Re: Wiedermal: Virtuelle Methoden
Date: 16 Oct 1995 14:30:02 GMT
Organization: University of Bonn, Germany
Message-ID: <45tq9a$pbg@news.rhrz.uni-bonn.de>
References: <45qosk$t10@robot.mayn.de>
NNTP-Posting-Host: asl2.ikp.uni-bonn.de
X-Newsreader: TIN [version 1.2 PL2]