c++ friend по - Разница между частным, общественным и защищенным наследованием





7 Answers

class A 
{
public:
    int x;
protected:
    int y;
private:
    int z;
};

class B : public A
{
    // x is public
    // y is protected
    // z is not accessible from B
};

class C : protected A
{
    // x is protected
    // y is protected
    // z is not accessible from C
};

class D : private A    // 'private' is default for classes
{
    // x is private
    // y is private
    // z is not accessible from D
};

ВАЖНОЕ ПРИМЕЧАНИЕ. Классы B, C и D содержат переменные x, y и z. Это просто вопрос доступа.

Об использовании защищенного и частного наследования вы можете прочитать here .

умолчанию виды наследования

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




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

  • public -> публичные члены базового класса будут общедоступными (обычно это значение по умолчанию)
  • protected -> публичные члены базового класса будут защищены
  • private -> публичные члены базового класса будут закрытыми

Как подчеркивает litb, публичное наследование является традиционным наследованием, которое вы увидите на большинстве языков программирования. Это моделирует отношения «IS-A». Частное наследование, что-то, что AFAIK, свойственное C ++, является отношением «ВЫПОЛНЕННЫЕ В УСЛОВИЯХ». То есть вы хотите использовать открытый интерфейс в производном классе, но не хотите, чтобы пользователь производного класса имел доступ к этому интерфейсу. Многие утверждают, что в этом случае вы должны агрегировать базовый класс, то есть вместо базового класса как частной базы, сделать в члене производного, чтобы повторно использовать функциональность базового класса.




Member in base class : Private   Protected   Public   

Тип наследования : Объект, унаследованный как :

Private            :   Inaccessible   Private     Private   
Protected          :   Inaccessible   Protected   Protected  
Public             :   Inaccessible   Protected   Public



Публичное наследование моделирует отношения IS-A. С

class B {};
class D : public B {};

каждый D является B

Частное наследование моделирует отношения IS-IMPLEMENTED-USING (или что-то другое). С

class B {};
class D : private B {};

D не является B , но каждый D использует свой B в своей реализации. Частное наследование всегда можно устранить, используя вместо него:

class B {};
class D {
  private: 
    B b_;
};

Этот D тоже может быть реализован с использованием B , в этом случае с использованием его b_ . Сдерживание является менее жесткой связью между типами, чем наследование, поэтому в целом это должно быть предпочтительным. Иногда использование сдерживания вместо частного наследования не так удобно, как частное наследование. Часто это хромое оправдание ленивости.

Я не думаю, что кто-то знает, какие protected модели наследования. По крайней мере, я пока не вижу убедительного объяснения.




Доступ к защищенным данным может осуществляться любыми классами, которые наследуются от вашего класса. Частные члены данных, однако, не могут. Допустим, у нас есть следующее:

class MyClass {
    private:
        int myPrivateMember;    // lol
    protected:
        int myProtectedMember;
};

Из вашего расширения в этот класс ссылка на this.myPrivateMember не будет работать. Однако this.myProtectedMember будет. Значение все еще инкапсулировано, поэтому, если у нас есть экземпляр этого класса myObj , то myObj.myProtectedMember не будет работать, поэтому он аналогичен функции для частного элемента данных.




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

На основе this примера для java ... Я думаю, что столик стоит тысячи слов :)




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

Его из ссылок 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
}



Related