Наследование частных членов в С++

предположим, что класс имеет частные члены данных, но сеттеры и получатели находятся в общедоступном масштабе. Если вы наследуете этот класс, вы все равно можете вызвать эти сеттеры и геттеры - разрешить доступ к частным данным в базовом классе. Как это возможно, поскольку упоминается, что производный класс не может наследовать частные члены данных.

Ответ 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 не виден ни из производных классов, ни из родительского класса; он виден только для методов родительского класса, даже если они наследуются (но не переопределяются).