Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Ableitungssproblem

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
14.01.2007, 18:08 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
also:


Code:
ArchivItem
v
ArchivItem_Bitmap
v
ArchivItem_Bitmap_Raw




Code:
ArchivItem_Bitmap
v
glArchivItem_Bitmap >> glArchivItem_Bitmap_Raw << ArchivItem_Bitmap_Raw




damit er das überhaupt kompiliert, sind die 2 Bases von glArchivItem_Bitmap_Raw virtual abgeleitet.

nun hat

ArchivItem_Bitmap eine virtuelle Funktion: int load(FILE *from), diese wird auch in ArchivItem_Bitmap_Raw implementiert.

Nur meldet er mir nun beim kompilieren von glArchivItem_Bitmap_Raw: "pure virtual functions found: int load(FILE *from)"

Warum das denn? eigentlich müsste er doch dann in glArchivItem_Bitmap_Raw die load von ArchivItem_Bitmap_Raw aufrufen - oder etwa nicht?

Was mach ich da falsch? (Das das Design nicht gerade geschickt ist ist mir klar, nur ist das eine in einer Bibliothek, welche durch die gl* im Endeffekt erweitert wird)
--
class God : public ChuckNorris { };

Dieser Post wurde am 14.01.2007 um 18:09 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.01.2007, 18:28 Uhr
(un)wissender
Niveauwart


Zeig mal die Header ich ahne da was...


Bearbeitung:

Du rufst keine virtuellen Funktionen im Konstruktor/Destruktor auf, richtig?


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 14.01.2007 um 18:32 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.01.2007, 18:47 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



C++:
class glArchivItem_Bitmap_Raw : public virtual ArchivItem_Bitmap_Raw, public virtual glArchivItem_Bitmap
{
public:
    glArchivItem_Bitmap_Raw(void);
    glArchivItem_Bitmap_Raw(const glArchivItem_Bitmap_Raw *item);
};




C++:
glArchivItem_Bitmap_Raw::glArchivItem_Bitmap_Raw(void) : ArchivItem_Bitmap_Raw(), glArchivItem_Bitmap()
{
}

glArchivItem_Bitmap_Raw::glArchivItem_Bitmap_Raw(const glArchivItem_Bitmap_Raw *item) : ArchivItem_Bitmap_Raw(item), glArchivItem_Bitmap(item)
{
}


Naja so. Er kompilierts ja soweit bis auf "pure virtual function int load(FILE *from)" - welche in ArchivItem_Bitmap_Raw implementiert ist, und in ArchivItem_Bitmap pure-virtual ist.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.01.2007, 18:56 Uhr
(un)wissender
Niveauwart


Ich vermute eine Uneindeutigkeit, da es zwei(!) virtual int load(FILE *from) gibt, einmal die von glArchivItem_Bitmap (erbt von ArchivItem_Bitmap und damit die pure virtual int load(FILE *from) und zum anderen die implementierte load von ArchivItem_Bitmap_Raw.

Um das ganze eindeutig zu halten:
In glArchivItem_Bitmap_Raw int load(FILE *from) überschreiben und dann darin explizit bspw.: ArchivItem_Bitmap::load aufrufen. Oder sonst immer voll qualifiziert die Methode aufrufen. Ist aber unschön.

Compiler haben mit solchen Sachen oft ein Problem, habe ein ähnliches Problem z.B. bei dem VC2005 festgestellt.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.01.2007, 19:21 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


der vs2005 meldet ja nicht mal "ambigous base" - der nimmt das ja so hin, intern funktionieren tut es dann aber nicht.

Ansonsten - direkt aufrufen klappt auch nicht so wie es soll,
dem Debugger zu entnehmen sieht das dann so aus:

http://ma.ra-doersch.de/klassen.JPG

und das ist halt mist! er füllt es zwar mit


C++:
int glArchivItem_Bitmap_Raw::load(FILE *file, const ArchivItem_Palette *palette)
{
    return ArchivItem_Bitmap_Raw::load(file, palette);
}



nur eben in das "falsche" baseobjekt

[edit]
bzw, mir fällt grad auf, der füllt irgendwas, nur nicht das was er soll, die daten sind völliger schrott die da drinstehen?!?
--
class God : public ChuckNorris { };

Dieser Post wurde am 14.01.2007 um 20:14 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.01.2007, 20:59 Uhr
(un)wissender
Niveauwart


Hm, das Ding ist wohl, das eigentlich schon ArchivItem_Bitmap_Raw und glArchivItem_Bitmap virtual von ArchivItem_Bitmap erben sollten.
Es gibt jetzt zwei ArchivItem_Bitmap-Objekte in einem glArchivItem_Bitmap_Raw-Objekt.
Super ärgerlich, da du unbegingt sicherstellen musst, dass nur immer eins benutzt wird.
Kannst du das? Ich weiß nicht recht. Kommt auf die sonstigen Methoden und so an.

Anonsten musst du dein Design ändern, wenn du auf ArchivItem_Bitmap_Raw und glArchivItem_Bitmap keine Einfluß hast.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.01.2007, 21:44 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja auf die gl*-Teile hab ich direkten Einfluss, das andere ist ne Bibliothek - die zu ändern würde gewaltig Probleme erzeugen, da man die ArchivItem_*-Teile auch noch instanzieren können muss.

Das Sicherstellen das nur eins benutzt wird - das ist das Problem - aber mal schaun wie sich das lösen lässt, evtl wirds dann nicht ganz so "schön" - aber immerhin.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.01.2007, 22:37 Uhr
(un)wissender
Niveauwart


Tja das ist das Problem mit der Mehrfachvererbung. Zum Designzeitpunkt muss bekannt sein, wie die Klassen verwendet werden, um dann ggf. ein virtual einzufügen. Aber wer kann schon im vorraus wissen, wie eine Bibliothek genutzt wird?
Viel Glück, vielleicht hat ja auch noch jemand anderes eine gute Idee.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.01.2007, 20:16 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


So folgender Trick hat geklappt:

in der Library:


Code:
ArchivItem_Bitmap renamed to baseArchivItem_Bitmap
ArchivItem_Bitmap_Raw renamed to baseArchivItem_Bitmap_Raw
usw





Code:
ArchivItem_Bitmap -virtual-> baseArchivItem_Bitmap
baseArchivItem_Bitmap_Raw -virtual-> baseArchivItem_Bitmap
ArchivItem_Bitmap_Raw -> baseArchivItem_Bitmap_Raw, ArchivItem_Bitmap
usw




dadurch bleibt die Schnittstelle nach außen gewahrt, und im Programm kann man nun folgendes:


Code:
glArchivItem_Bitmap -virtual-> baseArchivItem_Bitmap
glArchivItem_Bitmap_Raw -> baseArchivItem_Bitmap_Raw, glArchivItem_Bitmap
usw




und voila: es klappt so wie es soll, da die "Virtualisierungs-Raute" so erhalten bleibt.

(ok ein paar Änderungen in den Programmen war trotzdem nötig: ein paar C-Style-Casts mussten in dynamic_casts umgewandelt werden, aber nix tragisches)

Achja - und scheinbar hat das Alignment dazwischengefunkt, ich habe nun alle daten per
C++:
#pragma pack(push, 1)
...
#pragma pack(pop)



"gesichert", nun gibts keine Überschneidungen mehr je Kontext (u.A da er scheinbar in der Library anders gefüllt hat als in der Anwendung dann

Naja somit wär das auch gelöst *jihaa*
--
class God : public ChuckNorris { };
 
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: