Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Virtuelle Funktionen und virtuelle Destruktoren!?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.07.2006, 19:39 Uhr
~zuGast
Gast


ALso ich hab noch ein kleines Verständnisproblem zu Virtuellen Methoden. Vielleicht kann mir jemand erklären was es grundsätzlich bringt Funktionen Virtuell zu machen.

(Wenn es nicht so einfach ist das zu erklären dann schreib ich nochmal konkreter meine Probleme!)

Danke

zuGast
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.07.2006, 21:14 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
naja beispiel:


C++:
class Base
{
public:
  void foo() { printf("base\n"); }
};

class A : public Base
{
public:
  void foo() { printf("A\n"); }
};

int main()
{
  A a;
  Base *base = &a;

  base->foo();
}



was glaubst du was ausgegeben wird?
In diesem Fall wird "base" ausgegeben, obwohl ja "base" auf "a" zeigt.


C++:
class Base
{
public:
  virtual void foo() { printf("base\n"); }
};

class A : public Base
{
public:
  void foo() { printf("A\n"); }
};

int main()
{
  A a;
  Base *base = &a;

  base->foo();
}



was glaubst du was nun ausgegeben wird?
In diesem Fall wird "A" ausgegeben, da "foo" in base als virtuell deklariert worden ist.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.07.2006, 23:13 Uhr
~zuGast
Gast


hi,
hmm ja schon aber warum lass ich die funktion foo nicht einfach ganz weg dann hätte ich doch auch keine probleme mehr oder?
und was hat es mit virtuellen Destruktoren auf sich. (weil in diesem fall wird doch dann der virtuelle und der nicht virtuelle Destruktor aufgerufen)

Danke

zuGast
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.07.2006, 09:08 Uhr
~zuGast
Gast


ups...[EDIT] ICh meine natürlich dass man die Funktion Foo der BASISKLASSE weglässt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.07.2006, 11:41 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von ~zuGast:
ups...[EDIT] ICh meine natürlich dass man die Funktion Foo der BASISKLASSE weglässt.


dann funktioniert aber der aufruf


C++:
base->foo();



nicht, das die Klasse "Base" "foo" ja nicht kennt.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.07.2006, 16:41 Uhr
~zuGast
Gast


Gut, das hab ich soweit verstanden. Aber warum wird zum Beispiel wenn man Destruktoren virtual definiert der virtuelle selber auch aufgerufen dass is ja bei virtuellen Methoden nicht so.

Folgender Code

C++:
class Base{
public:
  Base();
  virtual ~Base();  // <-warum wird dieser auch aufgerufen?

  virtual void Func();

};
//...
class Derived : public Base {
public:
  Derived();
  virtual ~Derived();

  virtual void Func();
};

int main()
{
  Base *Basisklasse = new Derived;
  Basisklasse->Func();
  
  delete Basisklasse;
  return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.07.2006, 18:10 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.07.2006, 09:46 Uhr
~stephanw
Gast


Weil ein Destruktor eben keine normale Methode ist. Wenn in der Klasse Base irgendwelche Aufräumarbeiten nötig sind, müssen diese ja auch durchgeführt werden!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.07.2006, 11:23 Uhr
RHBaum




Zitat:

Gut, das hab ich soweit verstanden. Aber warum wird zum Beispiel wenn man Destruktoren virtual definiert der virtuelle selber auch aufgerufen dass is ja bei virtuellen Methoden nicht so.



In der Tat, Ziel bei polymorphen klassen bei Destruktor und Methoden iss kleinwenig anders.

Methode: einfach nur die eine "richtige" aufrufen.

Destruktor: beim "richtigen" destruktor beginnen und alle destruktoren aller beteiligten klassen bis zur basisklasse hinauf aufzurufen.

Um das "richtig" aber herauszubekommen, also um welche klasse der hirarchie es sich wirklich handelt, dazu braucht man die vtable, und damit virtual. Deswegen sollte bei als basis vorgesehene klassen der destruktor immer virtual sein.
whaerend nicht virtuelle methoden auch an ner klasse mit vererbung durchaus sinn machen, sind nichtvirtuelle destruktoren das killerkriterium fuer polymorph behandelte klassen (falscher einsprungspunkt fuer destruktion, es bleiben fragmente der abgeleiteten klassen undestruktiert -> memory leaks und undefiniertes verhalten)


Warum der konstruktur nie virtual sein braucht / darf, das kannst dir nu sicher selbst beantworten ^^

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: