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: multiple inheritance

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





PostPosted: Thu Apr 01, 2004 7:42 am    Post subject: Re: multiple inheritance Reply with quote



Daniel Schüle wrote:

Quote:
gekürzt auf das, was ich für wesentlich halte...

class base
{
public:
base(const std::string & name_) : name(name_) {}
std::string name;
};
class derived1 : public base
class derived2 : public base
struct multiple : derived1, derived2
void class_test()
{
multiple m;
cout << m.derived1::name << endl; // immer ok
cout << m.derived2::name << endl; // immer ok
cout << m.name << endl; // 1
cout << m.foo << endl; // 2
}

Wie mache ich die Aufloesung richtig?


Zunächst: multiple soll wohl einen einzigen Namen haben, oder?
Also kann der Name nicht auf diese Art geerbt werden, weil sonst
multiple plötzlich zwei Namen hat.
"multiple ist ein derived1 ist ein derived2" ist ein logischer
Widerspruch!
Vielleicht kannst Du die Mehrfachvererbung ersetzen durch eine "hat
ein" Beziehung, dann besitzt multiple Attribute vom Typ derived1
und derived2.

Eine andere Möglichkeit wäre, dass base nicht über derived1/2
vererbt wird, sondern dass multiple direkt von base erbt.

Ein anderer Gedanke wäre, über eine virtual Vererbung auf eine
gemeinsame base Klasse zu verweisen.
Aber da ist mir nicht klar, wie das mit konkurrierenden Namen
funktionieren soll. Vielleicht weiß da jemand anders weiter.

Ich würde es so machen: jede der Klassen erhält ein Attribut vom typ
base, also so:
class derived1 {
public:
derived1(const std::string & n):nameProperty(n) {}
base nameProperty;
}
usw.
Dasselbe würde ich in multiple machen.
Es sollte nun kein Problem mehr sein, von beiden Klassen zu erben.

Bernhard

--
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
Daniel Schüle
Guest





PostPosted: Thu Apr 01, 2004 4:06 pm    Post subject: Re: multiple inheritance Reply with quote




[..]

ich musste dazusagen, dass der obige Fall ein konstruierter ist
und spiegelt kein Designproblem von meiner Seite

ich habe nur in der letzten Zeit wieder mehr Zeit mich der
Programmierung zuzuwenden und die C++ Konstrukte
naher anzuschaunen, bei deren Verwendung ich momentan
unsicher bin

ich habe die Codebeispiele fruher in Bucher gesehen
(habe sie jetzt nicht vor mir liegen)
was ich allerdings nicht weiss, ob ich Fehler mache
(in der Symatnik der using direktive) oder Compiler(?)

ware nett wenn jemand den Code durch andere Compiler
durchjagt und vom Ergebnis berichtet

MfG

Daniel

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





PostPosted: Thu Apr 01, 2004 7:58 pm    Post subject: Re: multiple inheritance Reply with quote



Daniel Schüle wrote:
Quote:
[..]

ich musste dazusagen, dass der obige Fall ein konstruierter ist
und spiegelt kein Designproblem von meiner Seite

ich habe nur in der letzten Zeit wieder mehr Zeit mich der
Programmierung zuzuwenden und die C++ Konstrukte
naher anzuschaunen, bei deren Verwendung ich momentan
unsicher bin

ich habe die Codebeispiele fruher in Bucher gesehen
(habe sie jetzt nicht vor mir liegen)
was ich allerdings nicht weiss, ob ich Fehler mache
(in der Symatnik der using direktive) oder Compiler(?)

ware nett wenn jemand den Code durch andere Compiler
durchjagt und vom Ergebnis berichtet

MfG

Daniel

-VC 7.1 kompiliert es
..( nachdem ich test ein using namespace std spendieret habe).

Ergebniss:
derived1
derived2
derived1
10

Gruß

Gerd

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





PostPosted: Thu Apr 01, 2004 8:18 pm    Post subject: Re: multiple inheritance Reply with quote

Daniel Schüle wrote:

Quote:
Hallo NG

ich habe eine grundsatzliche Frage (unten :-)

[code]

g++3.3 sieht die Faelle 1 und 2 beide als ambigious an
icc7 kann die Zweideutigkeit komischerweise nur bei 2 aufloesen

die Frage, die sich mir stellt ist nun ... werden die Klassenvariablen
"name" und "foo" etwa unterschiedlich behandelt?
"name" kommt ja eigentlich von "base", ist aber in jedem "derived"
vertretten (da keine virtuale Ableitung)
"foo" kommen nicht von base, sind aber auch jedem "derived" drin
(und sind dazu noch des unterschiedlichen Types)
meinem Verstandnis nach sollte die Aufloesung in beiden
Faellen gleich behandelt werden

Wie mache ich die Aufloesung richtig?


MfG

Daniel

7.3.3 [14]

All instances of the name mentioned in a using-declaration shall be
accessible. In particular, if a derived class uses a using-declaration to
access a member of a base class, the member name shall be accessible. If
the name is that of an overloaded member function, then all functions named
shall be accessible. The base class members mentioned by a
using-declaration shall be visible in the scope of at least one of the
direct base classes of the class where the using-declaration is specified.
[Note: because a using-declaration designates a base class member (and not
a member subobject or a member function of a base class subobject), a
using-declaration cannot be used to resolve inherited member ambiguities.

Laut 'Note:' geht es also gar nicht.

Die beiden foo liegen in unterschiedlichen Scopes (derived1 und derived2)
deshalb ist die Zuordnung per used eindeutig (hier macht gcc etwas falsch).
Bei name ist der Scope allerdings beide male gleich (base). Daher müssen
beide Instanzen der Variablen per using in den aktuellen Scope gebracht
werden.

Grüße
Kai
--
This signature is left as an exercise for the reader.

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





PostPosted: Fri Apr 02, 2004 4:20 am    Post subject: Re: multiple inheritance Reply with quote

Daniel Schüle wrote:

Quote:

ich musste dazusagen, dass der obige Fall ein konstruierter ist
und spiegelt kein Designproblem von meiner Seite

ich habe nur in der letzten Zeit wieder mehr Zeit mich der
Programmierung zuzuwenden und die C++ Konstrukte
naher anzuschaunen, bei deren Verwendung ich momentan
unsicher bin


Dann möchte ich Dir einen Tipp weitergeben, den ich mal in einem
Seminar gehört habe, den ich selber zwar nicht ganz so endgültig
verstehe, den ich mir aber gut gemerkt habe:

Wenn man Mehrfachvererbung benötigt, dann sollte man mal sein Design
überdenken. Alle Probleme sollten mindestens mit vergleichbarer
Eleganz auch ohne Mehrfachvererbung machbar sein.

Immer wenn ich über Mehrfachvererbung in der Vergangenheit
nachgedacht habe, bin ich kritisch über den Entwurf hergefallen.
Oft hat sich gezeigt, dass die "ist ein..." Beziehung der Vererbung
besser durch eine "hat ein ..." Beziehung dargestellt werden konnte
oder durch eine grundsätzlich andere Klassenkonstellation ein
besseres Grundkonzept gefunden werden konnte.

Es ist aber im allgemeinen sehr schwer, selbst auf eine bessere
Designidee zu kommen, wenn man sich erst mal an einer Denkweise
festgebissen hat.

Bernhard

--
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
Marcel Müller
Guest





PostPosted: Fri Apr 02, 2004 12:37 pm    Post subject: Re: multiple inheritance Reply with quote

Bernhard Holzmayer wrote:

Quote:
Wenn man Mehrfachvererbung benötigt, dann sollte man mal sein Design
überdenken. Alle Probleme sollten mindestens mit vergleichbarer
Eleganz auch ohne Mehrfachvererbung machbar sein.

Immer wenn ich über Mehrfachvererbung in der Vergangenheit
nachgedacht habe, bin ich kritisch über den Entwurf hergefallen.
Oft hat sich gezeigt, dass die "ist ein..." Beziehung der Vererbung
besser durch eine "hat ein ..." Beziehung dargestellt werden konnte
oder durch eine grundsätzlich andere Klassenkonstellation ein
besseres Grundkonzept gefunden werden konnte.

Und was ist mit Interfaces?

Gut, das fällt nicht so direkt unter Mehrfachvererbung, da ja keine
Implementationen hinter den Basisklassen stehen.

Wenn man allerdings mit verifizierten Interfaces arbeiten will,
(Proxy-Klassen, die das Interface-Protokoll zur Laufzeit kontrollieren),
ist es sehr sinnvoll, den Interfaces eine reale Factory-Methode zum
erzeugen der Proxy-Klasse zu verpassen (spätestens dann, wenn die
Interfaces fleißig voneinander erben).

struct myInterface
{ ...
virtual myInterface* GetVerified() const;
};

class myClass : public virtual myInterface, ...
{ ...
};

class VerifymyInterFace : public myInterface
{public:
VerifymyInterFace(myInterface);
... // verifizierte Methoden (Pre-/Postconditions)
virtual myInterface GetVerified() const
{ return this; } // nur einmal verifizieren
};
// Das Memory Management habe ich mal weggelassen.

Damit werden alle Interfaces zu abstrakten Klassen und voila - fertig
ist die Mehrfachvererbung.

Die einzige Alternative wäre über spezialisierte Templates. Das hat aber
andere Nachteile.

(Leider bleiben beide Lösungen bei Java & Co verwehrt.)

Gut, soetwas verwende ich üblicherweise nur für Debug-Builds.



Marcel

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





PostPosted: Mon Apr 05, 2004 4:46 am    Post subject: Re: multiple inheritance Reply with quote

Marcel Müller wrote:

Quote:
Bernhard Holzmayer wrote:

Wenn man Mehrfachvererbung benötigt, dann sollte man mal sein
Design überdenken. Alle Probleme sollten mindestens mit
vergleichbarer Eleganz auch ohne Mehrfachvererbung machbar sein.
(Hab ich in irgendeinem schlauen Buch gelesen - und glaube ich

inzwischen mit einigen Einschränkungen).
Quote:

Immer wenn ich über Mehrfachvererbung in der Vergangenheit
nachgedacht habe, bin ich kritisch über den Entwurf hergefallen.
Oft hat sich gezeigt, dass die "ist ein..." Beziehung der
Vererbung besser durch eine "hat ein ..." Beziehung dargestellt
werden konnte oder durch eine grundsätzlich andere
Klassenkonstellation ein besseres Grundkonzept gefunden werden
konnte.
Auch ich bin in einigen Fällen bei Mehrfachvererbung geblieben.

Warum auch nicht.

Quote:

Und was ist mit Interfaces?

Wenn es um diese "ist ein" Beziehung geht, dann gilt dasselbe.

Entweder ist es ein ... oder ein ... , meist nicht beides.

Natürlich ist es sehr effektiv, einfach von allen Klassen zu erben,
die einem ein bisschen Schreibarbeit abnehmen...


Quote:

Wenn man allerdings mit verifizierten Interfaces arbeiten will,
(Proxy-Klassen, die das Interface-Protokoll zur Laufzeit
kontrollieren), ist es sehr sinnvoll, den Interfaces eine reale
Factory-Methode zum erzeugen der Proxy-Klasse zu verpassen
(spätestens dann, wenn die Interfaces fleißig voneinander erben).


Hängt natürlich davon ab, wie das Design insgesamt aussieht.
Wenn ich mir so einen Reise-Steckeradapter vorstelle, der für
verschiedene Länder passende Stecker und/oder Buchsen anbietet,
dann besitzt das Ding eben verschiedene Stecker, von denen ich genau
einen nutze.
Der Strom will das natürlich nicht wissen, aber der Anwender wählt
eine aus, und lässt die anderen ungenutzt.
Und der Adapter schaltet genau diesen gewählten durch.
Für mich ein schönes Beispiel von "hat ein" Beziehung.
Es wäre falsch, wenn der Adapter (mein Proxy) alle Interfaces erben
wollte. Stattdessen würde ich versuchen, eine abstrakte
"Stromschnittstelle" zu implementieren (evtl. über Vererbung), und
die mechanische Ausprägung über Attribute (Komponenten) zu
implementieren.
Wenn nun jede dieser Attribute eine Stromschnittstelle hat, dann
lässt sich über die entsprechend normierte Schnittstelle eine
Verbindung zwischen beliebigen dieser Komponenten herstellen.
Ich glaube, da kann man sehr schöne Proxies mit bauen...

Für Debug-Effekte verwende ich Mehrfachvererbung hingegen sehr oft.
Es bietet sich ja geradzu an, dass jedes Objekt eine standardisierte
Debug-Möglichkeit implementiert, die man am besten sogar zur
Laufzeit parametrieren kann. Dann erbt eben jedes Objekt davon
(zusätzlich zur eigentlichen Architektur).
Das zählt aber in meinen Augen nicht!

Bernhard

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