[Polymorphie] Ctor einer indirekten Basisklasse aufrufen ( + stat. Attribute )



  • Hi,

    hab eine kleine Vererbungshierachie, auf deren untersten Ebene eine abstrakte Klasse steht, die eine Schnittstelle bietet, um aus Objekten XML-Elemente zu machen.

    class XMLElement {
    
    	public:
    		XMLElement(const std::string& elementName) :
    		  _elemName(elementName) {};
    
    		virtual	bool	readDistribution() = 0;
    		virtual bool	writeDistribution() = 0;
    
    	private:
    		std::string		_elemName;
    
    	};
    

    Mein Probelm ist, dass ich den Konstrukter nicht von einer indirekt abgeleiteten Klasse aufrufen kann, da dann Compilerfehler->Keine Basisklasse?

    class List : public XMLElement
    	{
    		// ..
    	}
    
    	class MyList : public List
    	{
    	public:
    		MyList()
    			: XMLElement("mylist")	// <-- Fehler !!!
    		{
    		};
    		// ..
    	}
    

    Kann ich den gewünschten Konstruktor irgendwie erreichen?

    Danke,
    don_basto.



  • Du kannst in der Zwischenklasse einen Konstruktor einbauen, der das übernimmt:

    List::List(const string& name="list") : XMLElement(name) {...}
    MyList::MyList() : List("mylist") {...}
    


  • 2 Möglichkeiten die ich sehe

    1. Möglichkeit

    class List : public XMLElement
        {
    
            List(string& elemName) : XMLElement(elemName) {} //1.Möglichkeit
        }
    
        class MyList : public List
        {
        public:
            MyList()
                : List("mylist")    // 1. Möglichkeit 
            {
            };
            // ..
        }
    

    2. Möglichkeit eine protected Methode setName(string& name) in XMLElement. Diese Methode rufst dann im Kontruktor von MyList auf



  • Danke! 👍
    Zu einfach, um selbst drauf zu kommen 😉 .

    Da hab ich gleich noch eine Frage dazu. Den Element-Namen möchte ich in einer statischen Funtkion zurückgeben. Dieser Name soll für jedes Objekt der selben Klassse gleich sein. Wenn ich _elemName in XMLElement statisch mach, gilt das dann doch auch für alle abgeleiteten Klassen der gleiche Name. Jede abgeleitete Klasse soll aber einen eigenen statischen Element-Namen haben. Und ich möchte gern mit der Klasse XMLElement vorgeben, dass sie abgeleiteten Klassen ihren eigenen Elementnamen statisch zur Verfügung stellen.
    Alle Klarheiten beseitigt? 😉

    Also kann ich ein Klassenattribut festlegen, was für jede abgeleitete Klasse einen anderen Wert hat?

    Danke,
    don_basto.

    @templäd: Mit der 2. Variante mache ich es auch bisher, gefallt mir aber nicht wirklich.



  • Nein, statische Funktionen können nicht virtuell sein, also lässt sich das nicht mit der Polymorphie kombinieren. Und ein statisches Element existiert afaik einmal für die Klasse und alle abgeleiteten Klassen. Du könntest höchstens den Namen "ganz oben" als const deklarieren (und alle Konstruktoren, die explizit einen Namen vorgeben, protected setzen), dann kannst du kontrollieren, daß jede Klasse den selben Namen zurückgibt.

    *etwas nachgedacht hat*

    Alternativ geht auch so etwas:

    class XMLElement
    {
    public:
      virtual const string& Name() {return "generic Element";}
    };
    
    class List : public XMLELement
    {
    public:
      virtual const string& Name() {return "List";}
    }
    


  • Ich hatte ursprünglich die Idee, an den Elementname ohne konkretes Objekt zu kommen. In meinem Programm erzeuge teilweise nur zu dem Zweck ein Objekt, um den Elementnamen herauszufinden. Dafür sollten statische Methoden und Attribute ja besser geeignet sein. Und da dieser Elementname von XMLElement ins Spiel gebracht wird, dachte ich, ich könnte es eben mit Vererbung machen. Vielleicht fällt mir was dazu ein .. .

    Bis dann,
    don_basto.


Anmelden zum Antworten