C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Re: Ist das wahr ?

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Rolf Magnus
Guest





PostPosted: Tue Sep 28, 2004 2:31 pm    Post subject: Re: Ist das wahr ? Reply with quote



Oliver S. wrote:

Quote:
Folgendes:

#include
class CCondVar
{
public:
virtual ~CCondVar() = 0;
};

class CNTCondVar : public CCondVar
{
public:
virtual ~CNTCondVar();
};

CNTCondVar::~CNTCondVar()
{
std::printf( "destructorn" );
}

main()
{
CNTCondVar cv;
}

wirft folgenden Linker-Fehler:

error LNK2019: unresolved external symbol "public: virtual
__thiscall CCondVar::~CCondVar(void)" referenced in function
"public: virtual __thiscall CNTCondVar::~CNTCondVar(void)"
fatal error LNK1120: 1 unresolved externals

Ist das wahr, daß Konstruktoren nicht pure-virtual sein können ?

Du meinst vermutlich Destruktoren. Doch, die können auch rein virtuell sein,
aber sie müssen trotzdem implementiert werden.

Quote:
Welchen Sinn soll das haben ?

Wenn ein Objekt erzeugt wird, wird der Konstruktor seiner Klasse und die
Konstruktoren aller Basisklassen aufgerufen, und so muß auch beim Zerstören
für jede Klasse der Destruktor aufgerufen werden. Wenn du den der
Basisklasse rein virtuell machst und ihn nicht implementierst, geht das
nicht.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Martin Winkler
Guest





PostPosted: Tue Sep 28, 2004 3:54 pm    Post subject: Re: Ist das wahr ? Reply with quote



Rolf Magnus wrote:
Quote:
Oliver S. wrote:


Folgendes:

#include
class CCondVar
{
public:
virtual ~CCondVar() = 0;
};

class CNTCondVar : public CCondVar
{
public:
virtual ~CNTCondVar();
};

CNTCondVar::~CNTCondVar()
{
std::printf( "destructorn" );
}

main()
{
CNTCondVar cv;
}

wirft folgenden Linker-Fehler:

error LNK2019: unresolved external symbol "public: virtual
__thiscall CCondVar::~CCondVar(void)" referenced in function
"public: virtual __thiscall CNTCondVar::~CNTCondVar(void)"
fatal error LNK1120: 1 unresolved externals

Ist das wahr, daß Konstruktoren nicht pure-virtual sein können ?


Du meinst vermutlich Destruktoren. Doch, die können auch rein virtuell sein,
aber sie müssen trotzdem implementiert werden.

Sie (Destruktoren) können (und müssen bei Polymorphie auch) virtuell
sein, aber nicht _rein_ virtuell, denn dann wäre keine Implementierung
da. Und die muß, wie du richtig bemerkst, da sein. (Was auch eine
Leerimplementierung sein kann.)

Gruß
Martin

--
http://www.jumli.de
http://www.jumlidev.de/forum/

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Tue Sep 28, 2004 4:04 pm    Post subject: Re: Ist das wahr ? Reply with quote



Martin Winkler wrote:

Quote:
Ist das wahr, daß Konstruktoren nicht pure-virtual sein können ?

Du meinst vermutlich Destruktoren. Doch, die können auch rein virtuell
sein, aber sie müssen trotzdem implementiert werden.

Sie (Destruktoren) können (und müssen bei Polymorphie auch) virtuell
sein, aber nicht _rein_ virtuell, denn dann wäre keine Implementierung
da.

Wie kommst du darauf, daß man rein virtuelle Funktionen nicht implementieren
könne? Und insbesondere bei rein virtuellen Destruktoren muß man das auch
aus dem von mir genannten Grund.

Quote:
Und die muß, wie du richtig bemerkst, da sein. (Was auch eine
Leerimplementierung sein kann.)

Ja.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Karl Heinz Buchegger
Guest





PostPosted: Tue Sep 28, 2004 4:07 pm    Post subject: Re: Ist das wahr ? Reply with quote

Martin Winkler wrote:
Quote:

[snip]

Sie (Destruktoren) können (und müssen bei Polymorphie auch) virtuell
sein, aber nicht _rein_ virtuell

doch.

Quote:
, denn dann wäre keine Implementierung
da.

Falsch. Wenn du eine Funktion _rein_ (pure) machst, heist das
noch lange nicht, das Du dafuer keine Implementierung machen darfst.
Das gilt fuer Destruktoren genauso wie fuer jede andere x-beliebige
Member-Funktion. Der Unterschied ist lediglich: Eine x-beliebige
pure Member-Funktion wird normalerweise nicht aufgerufen. Wenn
sie es wuerde, muesste sie auch implementiert werden.
Ein Destruktor wird aber *immer* aufgerufen. Daher muss er auch
eine Implementierung haben.

--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Martin Winkler
Guest





PostPosted: Tue Sep 28, 2004 4:21 pm    Post subject: Re: Ist das wahr ? Reply with quote

Karl Heinz Buchegger wrote:
Quote:
Martin Winkler wrote:

Falsch. Wenn du eine Funktion _rein_ (pure) machst, heist das
noch lange nicht, das Du dafuer keine Implementierung machen darfst.
Das gilt fuer Destruktoren genauso wie fuer jede andere x-beliebige
Member-Funktion. Der Unterschied ist lediglich: Eine x-beliebige
pure Member-Funktion wird normalerweise nicht aufgerufen. Wenn
sie es wuerde, muesste sie auch implementiert werden.
Ein Destruktor wird aber *immer* aufgerufen. Daher muss er auch
eine Implementierung haben.


Ups, danke für die Aufklärung. Man lernt doch in C++ auch nach Jahren
immer wieder dazu.
Das heißt also, wenn ich es nun richtig verstanden habe, "rein virtuell"
(also mit "=0" deklariert) heißt nicht, daß es keine Implementierung
gibt. Es heißt nur, daß die Methode von Klassen, die instanziiert
werden, überschrieben werden _muß_. Richtig so?

Gruß
Martin

--
http://www.jumli.de
http://www.jumlidev.de/forum/

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Rolf Magnus
Guest





PostPosted: Tue Sep 28, 2004 4:46 pm    Post subject: Re: Ist das wahr ? Reply with quote

Martin Winkler wrote:

Quote:
Das heißt also, wenn ich es nun richtig verstanden habe, "rein virtuell"
(also mit "=0" deklariert) heißt nicht, daß es keine Implementierung
gibt. Es heißt nur, daß die Methode von Klassen, die instanziiert
werden, überschrieben werden _muß_. Richtig so?

Genau.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Karl Heinz Buchegger
Guest





PostPosted: Tue Sep 28, 2004 6:24 pm    Post subject: Re: Ist das wahr ? Reply with quote

"Oliver S." wrote:
Quote:

Wenn ein Objekt erzeugt wird, wird der Konstruktor seiner
Klasse und die Konstruktoren aller Basisklassen aufgerufen, ...

Ist mir bekannt.

... und so muß auch beim Zerstören für jede Klasse der Destruktor
aufgerufen werden.

Ich dachte bisher, daß wenn ein pure-virtual Destruktor definiert
ist, die abgeleitete Klasse sich den statischen Aufruf an den De-
struktor der Basisklasse spart.

Das waere fatal.
Das wuerde namelich bedeuten, dass in der Basisklasse keine Aufraeumarbeiten
durch den Destruktor gemacht werden koennen. Das ganze RAII Konzept
waere ueber den Haufen geschmissen.

Gott sei Dank ist es nicht so.
Man kann zwar von einer Klasse die eine pure-virtual Methode enthaelt
direkt kein Objekt erzeugen. Aber ansonsten verhaelt sich diese Klasse
wie jede andere auch.

--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Karl Heinz Buchegger
Guest





PostPosted: Wed Sep 29, 2004 2:00 pm    Post subject: Re: Ist das wahr ? Reply with quote

"Oliver S." wrote:
Quote:

Ich dachte bisher, daß wenn ein pure-virtual Destruktor
definiert ist, die abgeleitete Klasse sich den statischen
Aufruf an den Destruktor der Basisklasse spart.

Das waere fatal.
...

Wenn Du weitergelesen hättest,

Das habe ich ...

Quote:
dann hättest Du mit dieser Aussage
in Bezug gesetzt, daß ich auch der Annahme war, daß pure-virtual
Destruktoren keinen Body haben können. Und unter der Annahme wär
es nicht fatal, wenn es keinen Aufruf des Basisklassen-Konstruk-
tors gegeben hätte.

Ich weiss.
Aber was waeren die Auswirkungen davon gewesen? Darueber
habe ich geschrieben. Was waeren die Konsequenzen gewesen wenn
der Basis-Destruktor nicht aufgerufen wuerde? Diese Konsequenzen
sind es, die fatal sind. Und da das so ist, wird der Destruktor
Aufruf eben nicht eingespart was gleichzeitig auch bedeutet das
es eine Implementierung geben muss. Du siehst, es greift eins
ins andere.

--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.