7
votes

Appelant les méthodes des parents et accéder à une variable privée dans une classe mère?

J'essaie d'obtenir le code suivant fonctionner, mais je ne trouve pas de documentation suffisante sur la manière dont C ++ gère le public vs héritage privé pour me permettre de faire ce que je veux. Si quelqu'un pouvait expliquer pourquoi je ne peux pas accéder à parent :: setsize (int) code> ou parent :: Taille code> Utilisation d'une héritage privé ou Parent :: Taille Code > Utiliser l'héritage public. Pour résoudre ce problème, j'ai besoin d'un getiser () code> et setsize () code> méthode dans le parent?

class Parent {
    private:
        int size;

    public:
        void setSize(int s);
};

void Parent::setSize(int s) {
    size = s;
}

class Child : private Parent {
    private:
        int c;

    public:
        void print();
};

void Child::print() {
    cout << size << endl;
}

int main() {
    Child child;

    child.setSize(4);

    child.print();

    return 0;
}


0 commentaires

4 Réponses :


7
votes

Lorsque vous utilisez l'héritage privé, tous les membres publics et protégés de la classe de base deviennent privés dans la classe dérivée. Dans votre exemple, setsize devient privé dans enfant , vous ne pouvez donc pas l'appeler à partir de principal .

Aussi, Taille est déjà privé dans parent . Une fois déclaré privé, un membre reste toujours privé à la classe de base, quel que soit le type d'héritage.


2 commentaires

YEP et les membres privés ne sont pas hérités, c'est pourquoi vous ne pouvez pas accéder aux membres privés de la classe de base


@Ned Batchelder: C'est pourquoi j'ai voté pour votre réponse. :) Je ne sais pas ce que veut exactement l'OP, car le héritage public normal aurait bien fonctionné.



0
votes

Vous ne pouvez pas accéder aux membres de données privés d'autres classes. Si vous souhaitez accéder aux attributs privés d'une superclas, vous devez le faire via des accesseurs publics ou protégés. Quant au reste, voir @ Casablanca's Répondre .


0 commentaires

23
votes

Modifier le parent à: xxx

si vous souhaitez accéder à la taille membre d'une classe dérivée, mais pas de l'extérieur de la classe, alors vous voulez protégé .

changer d'enfant à: xxx

Lorsque vous dites Classe enfant: Parent privé , vous disent que cela devrait être un secret que l'enfant est un parent. Votre code MAIN indique clairement que vous voulez que votre enfant soit manipulé comme un parent, il devrait donc être héritage public.


0 commentaires

-1
votes
#include <iostream>
using namespace std;


class Parent {
private:
    int size;

public:
    void setSize(int s);

    int fun()  //member function from base class to access the protected variable 
    {
        return size;
    }
};

void Parent::setSize(int s) {
size = s;
}

class Child : private Parent {
private:
    int c;

public:
    void print();


    using Parent::setSize; //new code line
    using Parent::fun;     //new code line
};

void Child::print() {
    cout << fun() << endl;
}

int main() {
    Child child;

    child.setSize(4);

    child.print();

    return 0;
}

1 commentaires

Bienvenue dans le débordement de la pile! Je vous recommande Prendre la tournée . Lorsque vous donnez une réponse, il est préférable de donner une explication sur la raison pour laquelle votre réponse est celle de votre réponse.