Vererbungs- Problem? Dringend!



  • Hallo,

    ich habe folgende Klassen:

    #include <vector>
    #include <string>
    #include <fstream>
    
    using namespace std;
    
    class Base {
    
    	private:	
    		Base* pointerOne;
    		Base* pointerTwo;
    
    	public:
    		Base* getPoinerOne() {
    			return pointerOne;	
    		}
    		Base* getPoinerTwo() {
    			return pointerTwo;	
    		}
    		void setPoinerOne(Base* value) {
    			pointerOne = value;
    		}
    		void setPoinerTwo(Base* value) {
    			pointerTwo = value;
    		}
    		virtual display() = 0;
    		virtual read(fstream* file) = 0;
    		virtual write(fstream* file) = 0;
    
    };
    
    typedef vector<Base*> EdgeVertex;
    
    template<class T> class Edge : Base {
    
    	private:
    		T weight; //das sind einfach die Daten, hier also Buchstaben (Ecken = Rechnernemane = Buchstaben)
    
    	public:
    		T getWeight() {
    			return weight;
    		}
    		void setWeight(T value) {
    			weight = value;
    		}
    		virtual display() {
    
    		}
    		virtual read(fstream* file) {
    
    		}
    		virtual write(fstream* file) {
    
    		}
    
    };
    
    template<class T> class Graph {
    
    	private:
    		EdgeVertex edges;
    		EdgeVertex vertexes;
    		string fileName;
    		fstream dataFile;
    
    	public:
    		void insVertex(Vertex<T> vertex) {
    
    		}
    		void insEdge(Edge<T>* edge) {
    			edges[edges.size()] = edge;
    		}
    		void read() {
    
    		}
    		void write() {
    
    		}
    
    };
    

    Beim Aufruf von

    Edge<string>* theEdge;
    theGraph.insEdge(theEdge);
    

    kommt

    error C2243: 'type cast' : conversion from 'class Edge<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > *' to 'class Base *' exists, but is inaccessible
    

    Was mache ich da falsch? Edge<string>* ist doch auf jeden Fall auch Base*, da

    class Edge<class T> : Base
    

    oder nicht



  • Bei privater Vererbung trifft die IST-EIN-Beziehung nicht zu.



  • Danke für die schnelle Antwort, aber ich verstehe leider nicht, was gemeint ist. Was ist private Vererbung? Wie kann ich das so lösen, dass Edge immer auch Base ist?



  • marcoow schrieb:

    Danke für die schnelle Antwort, aber ich verstehe leider nicht, was gemeint ist. Was ist private Vererbung? Wie kann ich das so lösen, dass Edge immer auch Base ist?

    Mit ein bisschen experimentieren hab ich's rausgekriegt:
    private Vererbung ist

    class x : y
    

    public Vererbung (da gilt dann x ist ein y) ist:

    class x : public y
    

    Vielleicht hilft's jemandem mit dem gleichen Problem.



  • Vererbung funktioniert so:
    class <Name> : <Zugriff> <Basisklasse> { ... }

    Dabei ist <Zugriff> entweder private, protected oder public. Wenn man es wegläßt (wie bei dir) wird private angenommen (Ausnahme: Die Klasse wird nicht mit class, sondern mit struct definiert, dann public).
    Die Art der Vererbung bestimmt, wie die Basisklasse von aussen sichtbar ist. Bei öffentlicher Vererbung sind alle public-Elemente der Basisklasse auch public-Elemente der abgeleiteten Klasse. Bei privater Vererbung werden die dagegen zu private-Elementen der abgeleiteten Klasse.
    Das bedeutet, dass bei öffentlicher Vererbung die öffentliche Schnittstelle der Klasse potentiell erweitert wird, bei privater Vererbung jedoch eingeschränkt. Damit ist nur bei öffentlicher Vererbung eine IST-EIN-Beziehung gegeben, bei privater nicht.
    protected Vererbung ist eher ein obskures Seitenthema, das so gut wie nie (aber nicht absolut nie 😉 ) verwendet wird.


Log in to reply