Ответ 1
Производный класс не наследует доступ к частным данным. Однако он наследует полный родительский объект, который содержит любые частные члены, которые объявляет этот класс.
предположим, что класс имеет частные члены данных, но сеттеры и получатели находятся в общедоступном масштабе. Если вы наследуете этот класс, вы все равно можете вызвать эти сеттеры и геттеры - разрешить доступ к частным данным в базовом классе. Как это возможно, поскольку упоминается, что производный класс не может наследовать частные члены данных.
Производный класс не наследует доступ к частным данным. Однако он наследует полный родительский объект, который содержит любые частные члены, которые объявляет этот класс.
Это зависит от типа наследования. Если вы наследуете конфиденциально, то производный класс НЕ имеет доступа к базовым частным членам.
Access public protected private
-----------------------------------------------------------
members of the same class yes yes yes
members of derived classes yes yes no
not members yes no no
Поскольку получатели и сеттеры public
- они могут быть вызваны кем угодно, а не только производными классами.
вы можете получить к ним доступ, установив доступ к сеттерам и геттерам и доступ к ним таким образом
*.h
class Mamifere
{
private:
int a;
public:
Mamifere();
virtual ~Mamifere();
int getA();
// ~Mamifere(); //le delete dans le exp02() affiche seulement mamifere mort :( destructeur de la class mere
void manger() ;
virtual void avancer() const;
};
class Deufin:public Mamifere{
public:
Deufin();
void manger() const;
void avancer() const;
~Deufin();
};
*.cpp
Mamifere::Mamifere(){
printf("nouveau mamifere est nee\n");
this->a=6;
}
Mamifere::~Mamifere(){
printf("mamifere Mort :(\n");
}
void Mamifere::manger() {
printf("hhhh je mange maifere %d\n",Mamifere::getA());
}
void Mamifere::avancer() const{
printf("allez-y Mamifere\n");
}
Deufin::Deufin(){
printf("nouveau Deufin est nee\n");
}
int Mamifere::getA(){
return this->a;
}
void Deufin::manger() const{
printf("hhhh je mange poisson\n");
}
void Deufin::avancer() const{
printf("allez-y Deufin\n");
}
Deufin::~Deufin(){
printf("Deufin Mort :(\n");
}
main.cpp
void exp031(){
Mamifere f;//nouveau mamifere est nee // nouveau Deufin est nee
Deufin d;
f.avancer();//allez-y Deufin (resolution dynamique des lien la presence de mot cle virtual)
f.manger();//hhhh je mange maifere (resolution static des lien pas de mot cle virtual)
printf("a=%d\n",d.getA());//Deufin Mort :( mamifere Mort :( (resolution static des lien la presence de mot cle virtual) distructeur de class fille appel auromatiquement le destructeur de la class mere
}
int main(){
exp031();
getchar();
return 0;
}
Getters и seters не дают вам полного контроля над частными данными. Элемент управления по-прежнему лежит в базовом классе.
Использование шаблона
class MyClass {
private: int a;
public: void setA(int x) { a = x; }
public: int getA() const { return a; }
};
кажется объектно-ориентированным и имеет отправку инкапсуляции.
Однако, как вы заметили, вы все равно можете напрямую обращаться к частному полю, и ничего не получилось, просто сделав a
общедоступным и получив доступ к нему напрямую.
Использование геттеров и сеттеров, подобных этому, на самом деле не имеет смысла в С++.
Они включены, но не наследуются. Что это значит:
: public SomeClass
: protected SomeClass
или даже : SomeClass
, эквивалентный : private SomeClass
) не сделает их доступными из методов дочернего класса или извне (this->a
и someobject.a
соответственно); Таким образом, в основном protected
не виден снаружи, хотя виден внутри и из производных классов (если : private Parent
не использовался), в то время как private
не виден ни из производных классов, ни из родительского класса; он виден только для методов родительского класса, даже если они наследуются (но не переопределяются).