Разница между частным, публичным и защищенным наследством - PullRequest
917 голосов
/ 14 мая 2009

В чем разница между наследованием public, private и protected в C ++? Все вопросы, которые я нашел на SO, касаются конкретных случаев.

Ответы [ 15 ]

7 голосов
/ 10 мая 2015
Accessors    | Base Class | Derived Class | World
—————————————+————————————+———————————————+———————
public       |      y     |       y       |   y
—————————————+————————————+———————————————+———————
protected    |      y     |       y       |   n
—————————————+————————————+———————————————+———————
private      |            |               |    
  or         |      y     |       n       |   n
no accessor  |            |               |

y: accessible
n: not accessible

На основании этого примера для Java ... Я думаю, что маленький столик стоит тысячу слов :)

7 голосов
/ 14 мая 2009

Резюме:

  • Личное: никто не может видеть его, кроме как внутри класса
  • Защищено: частные + производные классы могут видеть это
  • Публично: мир может это увидеть

При наследовании вы можете (на некоторых языках) изменить тип защиты элемента данных в определенном направлении, например, от охраняемого к общественному.

6 голосов
/ 06 января 2010

Private:

Закрытые члены базового класса могут быть доступны только членам этого базового класса.

Общественный:

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

Защищено:

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


Короче говоря:

частный : базовый

защищено : основание + производное

public : базовый + производный + любой другой член

4 голосов
/ 24 февраля 2015

Я нашел простой ответ и подумал о том, чтобы опубликовать его и в будущем.

Это по ссылкам http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers/

class Base
{
public:
    int m_nPublic; // can be accessed by anybody
private:
    int m_nPrivate; // can only be accessed by Base member functions (but not derived classes)
protected:
    int m_nProtected; // can be accessed by Base member functions, or derived classes.
};

class Derived: public Base
{
public:
    Derived()
    {
        // Derived's access to Base members is not influenced by the type of inheritance used,
        // so the following is always true:

        m_nPublic = 1; // allowed: can access public base members from derived class
        m_nPrivate = 2; // not allowed: can not access private base members from derived class
        m_nProtected = 3; // allowed: can access protected base members from derived class
    }
};

int main()
{
    Base cBase;
    cBase.m_nPublic = 1; // allowed: can access public members from outside class
    cBase.m_nPrivate = 2; // not allowed: can not access private members from outside class
    cBase.m_nProtected = 3; // not allowed: can not access protected members from outside class
}
3 голосов
/ 14 мая 2009

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

...