Dans le cas où les attributs de la classe mère sont privés, les classes filles ne peuvent pas accéder à ces attributs directement, même si elles en héritent. Dans ce cas, les classes filles peuvent seulement accéder aux membres publics et protégés de la classe mère.
Par exemple, considérons la classe mère "Personne" qui a un attribut privé "nom". La classe fille "Etudiant" hérite de la classe mère "Personne". Si "nom" est un attribut privé de la classe "Personne", alors la classe "Etudiant" ne peut pas accéder directement à cet attribut. Elle peut cependant utiliser une méthode publique ou protégée de la classe mère pour accéder ou modifier l'attribut.
Dans le cas où les attributs de la classe mère sont protégés, les classes filles peuvent accéder à ces attributs directement, mais uniquement dans la classe fille elle-même ou dans ses classes filles dérivées.
Par exemple, si "nom" est un attribut protégé de la classe "Personne", alors la classe "Etudiant" peut accéder directement à cet attribut dans la classe "Etudiant" ou dans une classe fille de "Etudiant".
Enfin, dans le cas où les attributs de la classe mère sont publics, les classes filles peuvent accéder à ces attributs directement, où qu'elles se trouvent.
Voici un exemple de classes "Personne" et "Etudiant" avec différents types d'héritage :
class Personne {
private:
string nom;
protected:
int age;
public:
Personne(string n, int a) : { nom=n; age=a;}
string getNom() const { return nom; }
void setNom(string n) { nom = n; }
int getAge() const { return age; }
void setAge(int a) { age = a; }
};
class Etudiant : public Personne {
private:
string niveau;
public:
Etudiant(string n, int a, string nv) : Personne(n, a) { niveau=nv;}
string getNiveau() const { return niveau; }
void setNiveau(string nv) { niveau = nv; }
void afficherInfos() const {
cout << "Nom : " << getNom() << endl;
cout << "Age : " << getAge() << endl;
cout << "Niveau : " << niveau << endl;
}
};
int main() {
Etudiant e("Bob", 20, "Licence");
e.setNom("Henzo"); // OK, setNom() est public
e.age = 21; // OK, age est protégé
e.niveau = "Master"; // OK, niveau est privé à Etudiant
e.afficherInfos(); // OK, getNom(), getAge() et getNiveau() sont publics
return 0;
}
Dans cet exemple, l'attribut "nom" est privé dans la classe "Personne", donc la classe "Etudiant" ne peut pas y accéder directement. Les méthodes "getNom()" et "setNom()" sont fournies pour permettre à la classe "Etudiant" d'accéder et de modifier l'attribut "nom".
L'attribut "age" est protégé dans la
classe "Personne". Cela signifie que la classe "Etudiant" peut y accéder directement, mais pas les classes qui héritent de "Etudiant". Par exemple, si une classe "Doctorant" hérite de "Etudiant", elle ne pourra pas accéder directement à l'attribut "age". Les méthodes "getAge()" et "setAge()" sont également fournies pour permettre à la classe "Etudiant" d'accéder et de modifier l'attribut "age".
En ce qui concerne les types d'héritage en C++, il y en a trois: privé, public et protégé.
L'héritage privé signifie que les membres publics et protégés de la classe de base deviennent membres privés de la classe dérivée. Cela signifie que la classe dérivée peut accéder aux membres de la classe de base, mais ils ne sont pas accessibles en dehors de la classe dérivée. Par exemple:
class A {
public:
int x;
protected:
int y;
private:
int z;
};
class B : private A {
public:
void foo() {
x = 1; // OK
y = 2; // OK
z = 3; // erreur de compilation - z est privé dans A
}
};
Dans cet exemple, la classe "B" hérite de "A" en utilisant l'héritage privé. Cela signifie que les membres publics et protégés de "A" (c'est-à-dire "x" et "y") deviennent membres privés de "B", tandis que "z" est inaccessible depuis "B". Dans la méthode "foo()", "B" peut accéder à "x" et "y", mais pas à "z".
L'héritage public signifie que les membres publics et protégés de la classe de base deviennent membres publics et protégés de la classe dérivée, respectivement. Cela signifie que la classe dérivée peut accéder aux membres de la classe de base et qu'ils sont également accessibles en dehors de la classe dérivée. Par exemple:
class A {
public:
int x;
protected:
int y;
private:
int z;
};
class B : public A {
public:
void foo() {
x = 1; // OK
y = 2; // OK
z = 3; // erreur de compilation - z est privé dans A
}
};
Dans cet exemple, la classe "B" hérite de "A" en utilisant l'héritage public. Cela signifie que les membres publics et protégés de "A" (c'est-à-dire "x" et "y") deviennent membres publics et protégés de "B", respectivement, tandis que "z" est inaccessible depuis "B". Dans la méthode "foo()", "B" peut accéder à "x" et "y", mais pas à "z".
L'héritage protégé est similaire à l'héritage public, sauf que les membres protégés de la classe de base deviennent membres protégés de la classe dérivée. Cela signifie que la classe dérivée peut accéder aux membres protégés de la classe de base, mais ils ne sont pas accessibles en dehors de la classe dérivée.
Voici un exemple pour illustrer l'héritage protégé :
class A {
protected:
int x;
public:
void foo() {
cout << "x = " << x << endl;
}
};
class B : protected A {
public:
void bar() {
x = 10; // Accès autorisé car x est protégé
foo(); // Accès autorisé car foo() est héritée en protégé
}
};
class C : public B {
public:
void baz() {
x = 20; // Erreur de compilation car x est protégé depuis B
foo(); // Accès autorisé car foo() est héritée en protégé depuis A
}
};
int main() {
B b;
C c;
b.bar();
c.baz();
return 0;
}
Dans cet exemple, la classe "A" a un membre protégé "x" et une méthode publique "foo()" qui affiche la valeur de "x". La classe "B" hérite de "A" en utilisant l'héritage protégé, donc "x" devient protégé dans "B" et "foo()" est également héritée en protégé. La classe "C" hérite de "B" en utilisant l'héritage public.
La méthode "bar()" de la classe "B" peut accéder à "x" et appeler "foo()" car ils sont protégés et hérités en protégé. La méthode "baz()" de la classe "C" peut appeler "foo()" car elle est également héritée en protégé, mais elle ne peut pas accéder à "x" directement car il est protégé depuis "B".
En général, l'héritage public est utilisé lorsque la classe dérivée doit accéder à tous les membres publics de la classe de base, l'héritage protégé est utilisé lorsque la classe dérivée doit accéder aux membres protégés de la classe de base, et l'héritage privé est utilisé lorsque la classe dérivée n'a pas besoin d'accéder aux membres de la classe de base.