private/protected Vererbung



  • Hallo,

    ich beschäftige mich zur Zeit mit Objektorientierter Programmierung und komme gerade bei meinem kleinen Programm nicht weiter.

    #include <iostream>
    #include <string>
    using namespace std;
    
    class A{
    protected:
    	string name;
    public:
    	A(string n="NN"):name(n){}
    
    	string getname1(void){return this->name;}
    
    };
    
    class B : protected A{
    private:
    	string ort;
    	int plz;
    	A * aP;
    public:
    	B(string o="NN",int p=00000):ort(o),plz(p),aP(new A){}//Konstruktor
    
    	B(string o,int p,string n):ort(o),plz(p),aP(new A(n)){}
    
    	B(const B & org):ort(org.ort),plz(org.plz),aP(new A(*org.aP)){}//Kopier Konstruktor
    
    	~B(){delete this->aP;}
    
    	string getname2(void){this->aP->name;}
    
    };
    
    void main(void){
    
    	B b1("Hamburg",51119,"Peter");
    	cout <<"name von A von B b1: ";
    	cout << b1.getname2();
    	cin.ignore();
    
    }
    

    error C2248: "A::name": Kein Zugriff auf protected Member, dessen Deklaration in der A-Klasse erfolgte.

    Ich kenn mich jetzt mit der Vererbung nicht so aus und das was ich gefunden habe hilft mir nicht weiter.


  • Mod

    1. Es macht wenig Sinn von A abzuleiten und auch noch einen Zeiger auf A mitzuführen.
    2. Wenn Du auf this->name zugegriffen hättest wäre dies gegangen. Ansonsten ist A::name protected und damit der Zugriff über einen Zeiger nicht erlaubt. "protected" bedeutet nicht "friend"



  • Hallo,

    ich hatte einfach einen Denkfehler. So ist es richtig:

    #include <iostream>
    #include <string>
    using namespace std;
    
    class A{
    private:
        string name;
    public:
        A(string n="NN"):name(n){}
    
        string getname1(void){return this->name;}
    
    };
    
    class B{
    private:
        string ort;
        int plz;
        A * aP;
    public:
        B(string o="NN",int p=00000):ort(o),plz(p),aP(new A){}//Konstruktor
    
        B(string o,int p,string n):ort(o),plz(p),aP(new A(n)){}
    
        B(const B & org):ort(org.ort),plz(org.plz),aP(new A(*org.aP)){}//Kopier Konstruktor
    
        ~B(){delete this->aP;}
    
        string getname2(void){return this->aP->getname1();}
    
    };
    
    void main(void){
    
        B b1("Hamburg",51119,"Peter");
        cout <<"name von A von B b1: ";
        cout << b1.getname2();
        cin.ignore();
    
    }
    

    Mein Methode getname1 ist in A public und somit kann ich diese einfach in der Klasse B benutzen. Danke für die Antwort.


Anmelden zum Antworten