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 

Frage zur Vererbung

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





PostPosted: Tue Apr 11, 2006 10:06 pm    Post subject: Frage zur Vererbung Reply with quote



Hallo,
ich habe eine Frage zu der Vererbung in C++. Da ich aus der Java-Ecke komme,
habe da ein kleines Verständnisproblem.
Sei m() eine Methode in der Klasse A und B, wobei B eine Unterklasse von A
ist. Ich will in B die Methode m aus A erweitern. Also die Methode m() aus B
führt dieselben Anweisung wie m() in A aus und noch eine andere Anweisung.
In Java rufe ich aus der Methdode m() aus B einfach mit super die Methode
m() aus A auf und füge dann noch die weiteren Anweisungen ein. In C++ muss
ich, wenn ich eine Methode m() überschreibenn will, die ganzen Befehle aus
der Methode m() der Oberklasse in die Methode der Unterklasse m() kopieren
und dann noch die zusätzlichen Erweiterungen einfügen? Habe ich das so
richtig verstanden?? Ist aber doch umständlich oder gibt es da kein super
wie in Java?
Hier mal ein Pseudocode für C++.
class A
{
protected:
int a;

public:
void m()
};

void A::m()
{a++};

class B
{
private:
int b;

public:
void m()
};

void B::m()
{a++; b++};

--
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
Heinz Ozwirk
Guest





PostPosted: Tue Apr 11, 2006 11:06 pm    Post subject: Re: Frage zur Vererbung Reply with quote



"Nico Render" <render34 (AT) aol (DOT) de> schrieb im Newsbeitrag news:e1gsi6$109$1 (AT) sycamore (DOT) fernuni-hagen.de...
Quote:
Hallo,
ich habe eine Frage zu der Vererbung in C++. Da ich aus der Java-Ecke komme,
habe da ein kleines Verständnisproblem.
Sei m() eine Methode in der Klasse A und B, wobei B eine Unterklasse von A
ist. Ich will in B die Methode m aus A erweitern. Also die Methode m() aus B
führt dieselben Anweisung wie m() in A aus und noch eine andere Anweisung.
In Java rufe ich aus der Methdode m() aus B einfach mit super die Methode
m() aus A auf und füge dann noch die weiteren Anweisungen ein. In C++ muss
ich, wenn ich eine Methode m() überschreibenn will, die ganzen Befehle aus
der Methode m() der Oberklasse in die Methode der Unterklasse m() kopieren
und dann noch die zusätzlichen Erweiterungen einfügen? Habe ich das so
richtig verstanden?? Ist aber doch umständlich oder gibt es da kein super
wie in Java?

So etwas wie "super" gibt es nicht. Macht ja auch keinen Sinn, da C++ im Gegensatz zu Java Mehrfach-Vererbung unterstützt, eine Klasse also von mehreren Klassen abgeleitet sein kann. Auf welche Basis-Klasse sollte sich "super" dann beziehen. Aber immerhin hat ja jede Klasse einen Namen, und wenn du in C++ partout Jave programmieren willst, dann gibt es ja auch noch typedef.

Quote:
Hier mal ein Pseudocode für C++.
class A
{
protected:
int a;

public:
void m()
};

void A::m()
{a++};

class B

So ist B keine von A abgeleitete Klasse. Wenn der Compiler B von A ableiten soll, dann muss man ihm das auch sagen. Also

class B: public A

Quote:
{
private:
int b;

public:
void m()
};

void B::m()
{a++; b++};

Das geht zwar, ist aber aufwändig, fehleranfällig und deshalb schlecht. Besser wäre

void B::m()
{
A::m();
b++; // Wenn man die Wahl hat, sollte man sich angewöhnen ++b bzw. --b zu verwenden...
}

Und wenn's wirklich wie Java aussehen soll...

class B: public A
{
typedef A super;
...
}

void B::m()
{
super::m();
++b;
}

Heinz

--
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
Dirk Clemens
Guest





PostPosted: Wed Apr 12, 2006 4:06 pm    Post subject: Re: Frage zur Vererbung Reply with quote



Heinz Ozwirk wrote:
Quote:
b++; // Wenn man die Wahl hat, sollte man sich angewöhnen ++b bzw. --b zu verwenden...
Warum?


--
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
Stefan Reuther
Guest





PostPosted: Wed Apr 12, 2006 7:06 pm    Post subject: Re: Frage zur Vererbung Reply with quote

Dirk Clemens wrote:
Quote:
Heinz Ozwirk wrote:
b++; // Wenn man die Wahl hat, sollte man sich angewöhnen ++b bzw. --b zu verwenden...

Warum?

Weil bei selbstdefinierten Klassen (z.B. den STL-Iteratoren) der
Prefix-++ im Allgemeinen schneller ist, da er sich nicht den vorigen
Wert für die Rückgabe merken muss.

Bei Zahlen oder Zeigern ist es egal.


Stefan

--
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
Jakob Bieling
Guest





PostPosted: Wed Apr 12, 2006 11:06 pm    Post subject: Re: Frage zur Vererbung Reply with quote

Heinz Ozwirk <hozwirk.SPAM (AT) arcor (DOT) de> wrote:


Quote:
einen Namen, und wenn du in C++ partout Jave programmieren willst,
dann gibt es ja auch noch typedef.

Dem stimme ich nicht ganz zu. Wenn jemand C++ programmieren will,
dann auch bitte richtig. Es gibt genug C++ Programme die z.B. bei der
Verwendung von new/delete (ich habe jetz absichtlich mal ein etwas
extremeres Beispiel ausgewaehlt, als das von dir erwaehnte) so aussehen
wie Java:

void foo ()
{
std::string* s = new std::string ("Hello World");

// ..

delete s;
}

Deswegen kann ich jedem nur raten, der von Java oder einer anderen
Sprache kommt, sich mit C++ ordentlich vertraut zu machen um die Sprache
dann auch angemessen benutzen zu koennen.

regards
--
jb

(reply address in rot13, unscramble first)


--
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
kanze
Guest





PostPosted: Thu Apr 13, 2006 3:06 pm    Post subject: Re: Frage zur Vererbung Reply with quote

Stefan Reuther wrote:
Quote:
Dirk Clemens wrote:
Heinz Ozwirk wrote:
b++; // Wenn man die Wahl hat, sollte man sich
angewöhnen ++b bzw. --b zu verwenden...

Warum?

Weil bei selbstdefinierten Klassen (z.B. den STL-Iteratoren)
der Prefix-++ im Allgemeinen schneller ist, da er sich nicht
den vorigen Wert für die Rückgabe merken muss.

Weil es bei selbstdefinierten Klassen wahrscheinlich nie
langsamer ist. Die Benchmarks, die ich mit den STL-Iteratoren
gemacht haben, zeigen keinen Unterschied.

Quote:
Bei Zahlen oder Zeigern ist es egal.

Bei neuen Projekten, wo es nichts existierend gibt, ist die
Präfix-Forme wahrscheinlich die bessere Lösung. Kann in jedem
Fall nicht Weh tun. Der Unterschied ist aber so gering, dass es
normallerweise nicht lohnt, eine existierende Praxis zu ändern.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
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
kanze
Guest





PostPosted: Thu Apr 13, 2006 3:06 pm    Post subject: Re: Frage zur Vererbung Reply with quote

Heinz Ozwirk wrote:
Quote:
"Nico Render" <render34 (AT) aol (DOT) de> schrieb im Newsbeitrag
news:e1gsi6$109$1 (AT) sycamore (DOT) fernuni-hagen.de...

ich habe eine Frage zu der Vererbung in C++. Da ich aus der
Java-Ecke komme, habe da ein kleines Verständnisproblem.

Sei m() eine Methode in der Klasse A und B, wobei B eine
Unterklasse von A ist. Ich will in B die Methode m aus A
erweitern. Also die Methode m() aus B führt dieselben
Anweisung wie m() in A aus und noch eine andere Anweisung.
In Java rufe ich aus der Methdode m() aus B einfach mit
super die Methode m() aus A auf und füge dann noch die
weiteren Anweisungen ein. In C++ muss ich, wenn ich eine
Methode m() überschreibenn will, die ganzen Befehle aus der
Methode m() der Oberklasse in die Methode der Unterklasse
m() kopieren und dann noch die zusätzlichen Erweiterungen
einfügen? Habe ich das so richtig verstanden?? Ist aber doch
umständlich oder gibt es da kein super wie in Java?

So etwas wie "super" gibt es nicht. Macht ja auch keinen Sinn,
da C++ im Gegensatz zu Java Mehrfach-Vererbung unterstützt,
eine Klasse also von mehreren Klassen abgeleitet sein kann.

Man könnte auch gerade das Gegenteil argumentieren. In Java
weißt du genau, wo die Funktion sich befinden muss, weil es gibt
nur eine Basis-Klasse. In C++ dagegen brauchst du die
Möglichkeit zu sagen, ich will es von einer Basis-Klasse, weiß
aber nicht, welche es enthält.

Quote:
Auf welche Basis-Klasse sollte sich "super" dann beziehen.

Und wenn ich f() aufrufe, und es kein f() in meiner Klasse gibt,
aus welchen Basis-Klasse soll es kommen. Bei der Benutzung von
»super« würde es heißen, lass diese Klasse weg, und such weiter.
(Aber nicht zu weit -- globale Symbole sollen nicht in Betracht
kommen.)

Quote:
Aber immerhin hat ja jede Klasse einen Namen, und wenn du in
C++ partout Jave programmieren willst, dann gibt es ja auch
noch typedef.

Das war der Argument, warum man super nicht brauchte; dass man
es leicht mittels typedef simulieren kann. Bei der
Mehrfachvererbung ist es aber nicht so leicht.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
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: Thu Apr 13, 2006 3:06 pm    Post subject: Re: Frage zur Vererbung Reply with quote

kanze wrote:

Quote:
Stefan Reuther wrote:
Dirk Clemens wrote:
Heinz Ozwirk wrote:
b++; // Wenn man die Wahl hat, sollte man sich
angewöhnen ++b bzw. --b zu verwenden...

Warum?

Weil bei selbstdefinierten Klassen (z.B. den STL-Iteratoren)
der Prefix-++ im Allgemeinen schneller ist, da er sich nicht
den vorigen Wert für die Rückgabe merken muss.

Weil es bei selbstdefinierten Klassen wahrscheinlich nie
langsamer ist. Die Benchmarks, die ich mit den STL-Iteratoren
gemacht haben, zeigen keinen Unterschied.

Bei Inlining ist es wahrscheinlich, daß der generierte Code gleich ist. Ohne
Inlining ist der Overhead zwar da, aber vermutlich doch recht gering. Aber
es mag ja Iteratoren geben, bei denen eine Kopie aufwendiger ist.

Quote:
Bei Zahlen oder Zeigern ist es egal.

Bei neuen Projekten, wo es nichts existierend gibt, ist die
Präfix-Forme wahrscheinlich die bessere Lösung. Kann in jedem
Fall nicht Weh tun. Der Unterschied ist aber so gering, dass es
normallerweise nicht lohnt, eine existierende Praxis zu ändern.

Ack

--
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
kanze
Guest





PostPosted: Tue Apr 18, 2006 10:06 am    Post subject: Re: Frage zur Vererbung Reply with quote

Rolf Magnus wrote:
Quote:
kanze wrote:

Stefan Reuther wrote:
Dirk Clemens wrote:
Heinz Ozwirk wrote:
b++; // Wenn man die Wahl hat, sollte man sich
angewöhnen ++b bzw. --b zu verwenden...

Warum?

Weil bei selbstdefinierten Klassen (z.B. den STL-Iteratoren) der
Prefix-++ im Allgemeinen schneller ist, da er sich nicht den
vorigen Wert für die Rückgabe merken muss.

Weil es bei selbstdefinierten Klassen wahrscheinlich nie langsamer
ist. Die Benchmarks, die ich mit den STL-Iteratoren gemacht haben,
zeigen keinen Unterschied.

Bei Inlining ist es wahrscheinlich, daß der generierte Code gleich
ist.

Wenn ich Benchmarks generiere, benutze ich die höchste
Optimisierungsstufe, die der Compiler anbietet. Also, mit
inlining. Wenn man die Performance braucht, gehe ich davon ab,
das er auch die höchste Optimisierungsstufe benutzt.

Quote:
Ohne Inlining ist der Overhead zwar da, aber vermutlich doch
recht gering. Aber es mag ja Iteratoren geben, bei denen eine
Kopie aufwendiger ist.

Zu aufwendig hoffentlich nicht, weil die STL kopiert schon
ziemlich viel Iteratoren. Aber ich kann es mir vorstellen, dass
es Fälle gibt, wo es einen Unterschied gibt; ich war selber
überrascht, dass auch bei den komplizierteren reverse_iterator
keinen Unterschied zu messen war.

Was einen messbaren Unterschied macht, ist ob ich end() jedesmal
aufrufe, oder ob ich es nur einmal vor der Schleife aufrufe, und
speichere den Wert in eine locale Variable. Wahrscheinlich weil
der Compiler es schwierig hat zu entdecken, dass das Ergebnis
von end() immer dasselbe ist, und also liest er den Wert
jedesmal neu aus dem Speicher. (Ich habe meine Tests auf einem
Sun Sparc gemacht. Vielleicht wäre das Ergebnis anders auf einer
anderen Architektur, eine z.B. mit wenigeren Registern.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
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
Guest






PostPosted: Fri May 05, 2006 2:21 pm    Post subject: Re: Frage zur Vererbung Reply with quote

Quote:
Ist aber doch umständlich oder gibt es da kein super
wie in Java?

Auch wenn meine Antwort etwas spät kommt, aber:

Wie's im Standard ist, weiß ich nicht genau, aber zumindest der
Microsoft-Compiler versteht durchaus folgendes:

void B::m()
{
__super::m();
mein toller Code...
}

Stephan

--
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
Andre Poenitz
Guest





PostPosted: Sun May 07, 2006 1:44 pm    Post subject: Re: Frage zur Vererbung Reply with quote

stephan (AT) sickert (DOT) de wrote:
Quote:
Ist aber doch umständlich oder gibt es da kein super
wie in Java?

Auch wenn meine Antwort etwas spät kommt, aber:

Wie's im Standard ist, weiß ich nicht genau, aber zumindest der
Microsoft-Compiler versteht durchaus folgendes:

void B::m()
{
__super::m();
mein toller Code...
}

Tja. Das steht nicht im Standard.

[Die __ sind schon ein gutes Zeichen, dass es eine compilerspezifische
Erweiterung ist]

Andre'

--
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.