 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Nico Render Guest
|
Posted: Tue Apr 11, 2006 10:06 pm Post subject: Frage zur Vererbung |
|
|
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
|
Posted: Tue Apr 11, 2006 11:06 pm Post subject: Re: Frage zur Vererbung |
|
|
"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
|
Posted: Wed Apr 12, 2006 4:06 pm Post subject: Re: Frage zur Vererbung |
|
|
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
|
Posted: Wed Apr 12, 2006 7:06 pm Post subject: Re: Frage zur Vererbung |
|
|
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
|
Posted: Wed Apr 12, 2006 11:06 pm Post subject: Re: Frage zur Vererbung |
|
|
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
|
Posted: Thu Apr 13, 2006 3:06 pm Post subject: Re: Frage zur Vererbung |
|
|
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
|
Posted: Thu Apr 13, 2006 3:06 pm Post subject: Re: Frage zur Vererbung |
|
|
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
|
Posted: Thu Apr 13, 2006 3:06 pm Post subject: Re: Frage zur Vererbung |
|
|
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
|
Posted: Tue Apr 18, 2006 10:06 am Post subject: Re: Frage zur Vererbung |
|
|
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
|
Posted: Fri May 05, 2006 2:21 pm Post subject: Re: Frage zur Vererbung |
|
|
| 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
|
Posted: Sun May 07, 2006 1:44 pm Post subject: Re: Frage zur Vererbung |
|
|
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 |
|
 |
|
|
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
|
|