|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 24.08.2007, 11:46 Titel: Abstrakte Klassen und Interfaceimplementierungen |
|
|
Hallo JLI,
ich hab dann auch mal ne Frage. Ich habe 3 Interfaces, B und C leiten sich von A ab.
CPP: | class A {
virtual void a() = 0;
};
class B : public A {
virtual void b() = 0;
};
class C : public A {
virtual void c() = 0;
};
|
Welche ich implementieren möchte. Natürlich möchte ich die funktion a() nur einmal implementieren also mache ich es wie folgt:
CPP: | class AImpl {
virtual void a(){...};
};
class BImpl : public AImpl, B {
virtual void b(){...};
};
class CImpl : public AImpl, C {
virtual void c(){...};
};
|
Also eigentlich.. ziemlich logisch und in anderen Objektorientierten Sprachen so absolut gar kein Problem (Java z.B.).
Aber mein lieber Freund GCC beschwert sich dass man BImpl und CImpl nicht instanziieren kann weil a() nicht implementiert ist.
Ich denke es liegt an problemen beim zusammenstellen der vtable, jemand ne ahnung wie man das lösen könnte? (außer in BImpl und CImpl ein virtual void a(){ AImpl::a(); } einzufügen?)
gruß,
xardie |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 24.08.2007, 14:59 Titel: |
|
|
hi xardie =),
also du hast die Funktion A::a() rein virtuell deklariert (wegen =0), wahrscheinlich um A zu einer abstrakten Klasse zu machen. Methoden die rein virtuell deklariert sind, müssen aber in den abgeleiteten Klassen neu implementiert werden; das ist der (bzw. ein) Unterschied zwischen virtuellen und rein virtuellen Methoden. Letztere können, müssen aber nicht in der abgeleiteten Klasse implementiert werden. Du könntest also die Funktionen a, b und c allesamt virtuell deklarieren, mit einer Standardimplementation. Dann hättest du aber das Problem, dass A, B und C keine abstrakten Klassen mehr sind. Für solche Probleme (wo du eine abstrakte Klasse ohne rein virtuelle Methoden haben musst) gibt es eine verbreitete Lösung(s. "Effektiv C++ programmieren"): Du musst den Destruktor einer Klasse rein virtuell deklarieren und für ihn trotzdem eine Implementierung darstellen. Eine andere Mögl. wäre z.B. auch, die Methode A::a() durch eine using deklaration in einer abgeleiteten Klasse private zu deklarieren, das stößt aber auf andere neue Probleme
Gruß DXer |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 24.08.2007, 17:32 Titel: |
|
|
Xardie, mach das =0 weg, wie DirectXer schon gesagt hat, oder gib jedem Delegat eine Methode a, die die Parentmethode aufruft. Welcome to C++.. ;) _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 24.08.2007, 18:01 Titel: |
|
|
Wegen diesem Problem bin ich damals von C++ zu C# gewechselt.
Weil C# einen Unterschied zwischen Abstrakter Klasse und Interface kennt, kommt C# mit deinem Szenario klar, C++ jedoch nicht.. _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
xardias JLI Master
Alter: 38 Anmeldedatum: 28.12.2003 Beiträge: 804 Wohnort: Palo Alto, CA Medaillen: Keine
|
Verfasst am: 25.08.2007, 07:17 Titel: |
|
|
Hazel hat Folgendes geschrieben: | Welcome to C++.. |
*seufz* ich sollte mir abgewöhnen nach stilistisch korrekten lösungen zu suchen.
Danke Jungs |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 25.08.2007, 17:00 Titel: |
|
|
Stilistisch korrekt ist nicht unbedingt gleich gut! |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|