Наследование закрытых членов в C ++ - PullRequest
15 голосов
/ 20 апреля 2010

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

Ответы [ 7 ]

27 голосов
/ 20 апреля 2010

Производный класс не наследует доступ к закрытым элементам данных. Однако он наследует полный родительский объект, который содержит все закрытые члены, которые этот класс объявляет.

8 голосов
/ 20 апреля 2010

Зависит от типа наследования. Если вы наследуете конфиденциально, то производный класс НЕ имеет доступа к закрытым членам Base.

Access                      public     protected    private
-----------------------------------------------------------
members of the same class      yes           yes        yes
members of derived classes     yes           yes         no
not members                    yes            no         no
4 голосов
/ 20 апреля 2010

Поскольку методы получения и установки public - они могут вызываться кем угодно, а не только производными классами.

2 голосов
/ 14 декабря 2015

вы можете получить к ним доступ, установив доступ к установщикам и получателям общедоступным и таким образом обращаясь к ним

*.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;
}
0 голосов
/ 13 июля 2018

Они включены, но не наследуются.Это означает следующее:

  • Любой тип наследования (: public SomeClass, : protected SomeClass или даже : SomeClass, эквивалентный : private SomeClass) не сделает их доступными для дочернего элементаметоды класса или за его пределами (this->a и someobject.a соответственно);
  • Они все еще будут там - занимают место в памяти, выделенной для экземпляра дочернего класса;
  • Унаследованные методы смогутполучить доступ к этому приватному полю.

Итак, в основном protected не виден снаружи, пока виден внутри и из производных классов (если : private Parent не использовался), тогда как private не виден изни производные классы, ни вне родительского класса;он виден только для методов родительского класса, даже если они наследуются (но не переопределяются).

0 голосов
/ 20 апреля 2010

Использование шаблона

class MyClass {
  private: int a;
  public: void setA(int x) { a = x; }
  public: int getA() const { return a; }
};

кажется объектно-ориентированным и имеет отправленную инкапсуляцию.

Однако, как вы заметили, вы все равно можете напрямую получить доступ ки ничего не получится, если просто сделать a общедоступным и получить к нему прямой доступ.

Использование таких методов получения и установки не имеет смысла в C ++.

0 голосов
/ 20 апреля 2010

Получатели и установщики не дают вам полный контроль над частными членами данных. Элемент управления по-прежнему лежит в базовом классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...