typedef der basisklasee wir verdeckt, aber wieso (gcc).



  • struct dummy : public dummy1, public dummy2
    {
        using dummy1::value_type;
    };
    


  • Das ist doch, weil typedefs nicht vererbt werden, oder? Was wird denn sonst noch nicht weitervererbt? Operatoren glaubich, sonst noch was?



  • Badestrand schrieb:

    Das ist doch, weil typedefs nicht vererbt werden, oder? Was wird denn sonst noch nicht weitervererbt? Operatoren glaubich, sonst noch was?

    ???



  • hustbaer schrieb:

    ???

    Naja, Funktionen und (nicht-private-) Variablen werden ja vererbt*, typedefs dagegen nicht. Klar, ist ja nix konkretes, sondern nur Kompilierzeit-Kram. Aber Operatoren werden ja auch nicht vererbt. Da wollte ich einfach mal wissen, ob es noch was gibt, was nicht vererbt wird 🤡 Aber wenns immer noch missverständlich ist, ists auch egal, komme gut so zurecht.

    *halt auch die Sichtbarkeit oder das Wissen des Compilers um diese Dinge



  • loehken schrieb:

    ...
    Man würde jetzt ja annehmen, da value_type in der Klasse dummy2 private ist, kann dieser nicht mit dem value_type von dummy1 kollidieren, ...

    Aber nur, wenn man mit C++ nicht ausreichend vertraut ist. :p 😉

    Zugriffsschutz hat nichts mit Sichtbarkeit zu tun.

    Gruß,

    Simon2.



  • Badestrand schrieb:

    hustbaer schrieb:

    ???

    Naja, Funktionen und (nicht-private-) Variablen werden ja vererbt*, typedefs dagegen nicht. Klar, ist ja nix konkretes, sondern nur Kompilierzeit-Kram. Aber Operatoren werden ja auch nicht vererbt. Da wollte ich einfach mal wissen, ob es noch was gibt, was nicht vererbt wird 🤡 Aber wenns immer noch missverständlich ist, ists auch egal, komme gut so zurecht.

    *halt auch die Sichtbarkeit oder das Wissen des Compilers um diese Dinge

    Ich verstehe nicht ganz was du mit "vererben" meinst, und wieso du denkst dass Operatoren und Typedefs nicht vererbt werden.
    Wenn du unter "vererbt werden" verstehst dass sie über den Namen der abgeleiteten Klasse erreichbar sind, dann werden typedefs sehr wohl vererbt.

    Probier mal folgendes in deinen Compiler zu füttern wenn du mir nicht glaubst:

    class test
    {
    public:
    	typedef int t;
    
    	void operator += (int i)
    	{
    	}
    };
    
    class test2 : public test
    {
    public:
    };
    
    int main()
    {
    	test2 t2;
    	test2::t i = 1;
    	t2 += i;
    	t2.operator +=(i);
    	t2.test2::operator +=(i);
    }
    


  • So ziemlich alles in deiner Klasse wird vererbt - einzige Ausnahme sind Konstruktoren und operator= (letzterer wird vom automatisch generierten op= der abgeleiteten Klasse überdeckt). Dein Problem ist jedoch, daß die Basisklasse zwei "Objekte"* mit dem gleichen Namen geerbt hat - und da ist der Zugriff mehrdeutig (aber das kann dir bei Methoden genauso passieren).

    * in diesem Fall Typen - aber die Regeln gelten genauso für alle Arten von Klassen-Membern.



  • hustbaer schrieb:

    Badestrand schrieb:

    ...

    Ich verstehe nicht ganz was du mit "vererben" meinst, und wieso du denkst dass Operatoren und Typedefs nicht vererbt werden.
    Wenn du unter "vererbt werden" verstehst dass sie über den Namen der abgeleiteten Klasse erreichbar sind, dann werden typedefs sehr wohl vererbt.

    Probier mal folgendes in deinen Compiler zu füttern wenn du mir nicht glaubst:

    ...
    

    Doch doch, ich glaube dir fast immer 😉 Wusste ich gar nicht, dass man mit BaseKlasse::bla drauf zugreifen kann - schön, wieder was gelernt 👍



  • `value_type' is not a member of `dummy'

    Nur ist diese Fehlermeldung nicht gerade hilfreich (wenn nicht sogar falsch), da es ja hier um Mehrdeutigkeit (ambiguity) geht.



  • exakt das hab ich auch gedacht.

    hab es jetzt eh ganz anders gemacht. typedefs gibts nur in traits klassen, deren typdefs werden als template parameter verwandt, die haben local scope und können damit nichts mehr verdecken.

    struct dummy1;
    struct dummy2;
    struct dummy;
    
    template <typename>
    struct traits;
    
    template <>
    struct traits<dummy1>{
        typedef int value_type;
    };
    
    template <>
    struct traits<dummy2>{
        typedef double value_type;
    };
    
    template <>
    struct traits<dummy>
        : public traits<dummy1>
    {};
    

    dadurch wird die multiple inheritance für typdefs aus der welt gesschafft. natürlich sieht das so wie ich es jetzt geschrieben habe recht sinnlos aus, ist aber von seiner funktionalität her entkernt. im zusammenhang wäre das zu komplex - geht halt wieder um facade's.

    danke euch allen, ingo.


Anmelden zum Antworten