[CImageList] Polymorphie geht nicht?



  • Hallo,

    hab gerade versucht eine eigene ImageList-Klasse zu schreiben, welche von CImageList abgeleitet ist. Da die FormView meiner Anwendung voll von Methoden ist, wollte ich einige auf die eintsprechenden Attribute (hier eine CImageList) auslagern, sonst wächst mir die View über den Kopf.

    class CMyImageList :
    	public CImageList
    {
    public:
    	CMyImageList(void);
    	~CMyImageList(void);
    
    	BOOL	Create(int nInitial, int nGrow);
    	int		Add(BYTE r, BYTE g, BYTE b);
    	BOOL	Replace(int nImage, BYTE r, BYTE g, BYTE b);
    };
    

    Doch die abgeleiteten Objekte von CMyImageList kennen plötzlich nicht mehr auf die öffentlichen Methoden von CImageList ?

    m_imageList.Create(16, 16, ILC_COLOR32, 4, 4);
    

    C2660: 'CMyImageList::Create': Funktion akzeptiert keine 5 Argumente

    Warum geht das plötzöich nicht mehr? 😮

    //EDIT:
    Wenn ich die CImageList-Methoden nicht überlade sondern andere Namen wähle(z.B. myCreate()), funktionierts ohne Probleme ..

    Danke,
    don_basto.



  • Weil deine 2-Parameter-Version von Create() die 5-Parameter-Version aus der Basisklasse überdeckt, wird letztere nicht mehr gefunden. Versuch' mal eine der folgenden Möglichkeiten:

    //a:
    using CImageList::Create();
    
    //b:
    //definiere alle Create()-Varianten aus der Basisklasse neu, so daß sie die Basisversion aufrufen, z.B.:
    BOOL Create(int cx,int cy,UINT Flags,int nInitial,int nGrow)
    {return CImageList::Create(cx,cy,Flags,nInitial,nGrow);}
    


  • Danke.
    Ich dachte aber, dass es dafür die Vererbung gibt, damit man nicht alle Methoden neu definieren muss. Denn sonst könnte ich möglicherweise statt Vererbung für Ansatz b schreiben (was ich aber nicht will):

    class CMyImageList /*: public CImageList */
    {
    public:
    	CMyImageList(void);
    	~CMyImageList(void);
    
    	BOOL	Create(int nInitial, int nGrow);
    	int	 Add(BYTE r, BYTE g, BYTE b);
    	BOOL	Replace(int nImage, BYTE r, BYTE g, BYTE b);
    	//	hier alle Methoden von CImageList einfügen und
    	//	an m_imageList weiterleiten
    
    private:
    	CImageList	m_imageList
    };
    

    Wieso werden die Funktionen überdeckt?



  • Ist so im Standard festgelegt 😉 Und es würde die Suche nach der richtigen Überladung auch deutlich erschweren, wenn der Compiler ALLE Basisklassen nach der richtigen Funktion absuchen müsste (vor allem: Was passt besser auf den Aufruf "member('3');" - die "member(int val)" in der eigenen Klasse oder die "member(short val)" von meinem Großvater? Vielleicht hatte dessen Urgroßvater auch eine Methode "member(char x, int n=1)" definiert)



  • Achso, na dann, der Standard, der hat immer Recht! 🤡

    Ich hab's jetzt mit der using-Deklaration implementiert. Allerdings meckert mein Compiler mit der Klammer, so geht's:

    using CImageList::Create;
    using CImageList::Add;
    using CImageList::Replace;
    

    Noch eine kurze Reflektion:
    (1) Überladen funzt nur innerhalb einer Klasse.
    (2) Beim Versuch, eine Funktion der Basisklasse zu 'Überladen', werden alle 'überladenen' Funktionen der Basisklasse verdeckt. Dies entspricht im Grunde einem Überschreiben, obwohl die Funktionsparameter verschieden sind.

    Soweit, so gut, 🙂
    don_basto.


Anmelden zum Antworten