 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Rolf Magnus Guest
|
Posted: Tue Sep 28, 2004 2:31 pm Post subject: Re: Ist das wahr ? |
|
|
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
|
Posted: Tue Sep 28, 2004 3:54 pm Post subject: Re: Ist das wahr ? |
|
|
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
|
Posted: Tue Sep 28, 2004 4:04 pm Post subject: Re: Ist das wahr ? |
|
|
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
|
Posted: Tue Sep 28, 2004 4:07 pm Post subject: Re: Ist das wahr ? |
|
|
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
|
Posted: Tue Sep 28, 2004 4:21 pm Post subject: Re: Ist das wahr ? |
|
|
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
|
Posted: Tue Sep 28, 2004 4:46 pm Post subject: Re: Ist das wahr ? |
|
|
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
|
Posted: Tue Sep 28, 2004 6:24 pm Post subject: Re: Ist das wahr ? |
|
|
"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
|
Posted: Wed Sep 29, 2004 2:00 pm Post subject: Re: Ist das wahr ? |
|
|
"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 |
|
 |
|
|
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
|
|