предположим, что класс имеет частные члены данных, но сеттеры и получатели находятся в общедоступном масштабе. Если вы наследуете этот класс, вы все равно можете вызвать эти сеттеры и геттеры - разрешить доступ к частным данным в базовом классе. Как это возможно, поскольку упоминается, что производный класс не может наследовать частные члены данных.
Наследование частных членов в С++
Ответ 1
Производный класс не наследует доступ к частным данным. Однако он наследует полный родительский объект, который содержит любые частные члены, которые объявляет этот класс.
Ответ 2
Это зависит от типа наследования. Если вы наследуете конфиденциально, то производный класс НЕ имеет доступа к базовым частным членам.
Access public protected private
-----------------------------------------------------------
members of the same class yes yes yes
members of derived classes yes yes no
not members yes no no
Ответ 3
Поскольку получатели и сеттеры public
- они могут быть вызваны кем угодно, а не только производными классами.
Ответ 4
вы можете получить к ним доступ, установив доступ к сеттерам и геттерам и доступ к ним таким образом
*.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;
}
Ответ 5
Getters и seters не дают вам полного контроля над частными данными. Элемент управления по-прежнему лежит в базовом классе.
Ответ 6
Использование шаблона
class MyClass {
private: int a;
public: void setA(int x) { a = x; }
public: int getA() const { return a; }
};
кажется объектно-ориентированным и имеет отправку инкапсуляции.
Однако, как вы заметили, вы все равно можете напрямую обращаться к частному полю, и ничего не получилось, просто сделав a
общедоступным и получив доступ к нему напрямую.
Использование геттеров и сеттеров, подобных этому, на самом деле не имеет смысла в С++.
Ответ 7
Они включены, но не наследуются. Что это значит:
- Любой наследуемый тип (
: public SomeClass
: protected SomeClass
или даже: SomeClass
, эквивалентный: private SomeClass
) не сделает их доступными из методов дочернего класса или извне (this->a
иsomeobject.a
соответственно); - Они все еще будут там - занять место в памяти, выделенное для экземпляра дочернего класса;
- Унаследованные методы смогут получить доступ к этому приватному полю.
Таким образом, в основном protected
не виден снаружи, хотя виден внутри и из производных классов (если : private Parent
не использовался), в то время как private
не виден ни из производных классов, ни из родительского класса; он виден только для методов родительского класса, даже если они наследуются (но не переопределяются).