17.5 Inheritance and access specifiers
https://www.learncpp.com/cpp-tutorial/inheritance-and-access-specifiers/
このセクションではpublic、private、protectedについて詳しく説明します.
パブリックおよびプライベートアクセス記述子を見たことがあります
共通メンバーはどこからでもアクセスでき、プライベートメンバーは同じクラスのメンバー関数からのみアクセスできます.
したがって、派生クラスからベースのプライベートメンバーに直接アクセスすることはできません.
protected access speciferはfriendクラスとderivedクラスでアクセス可能なメンバーです
でも外では近づけない
protectedのプロパティは派生クラスから直接アクセスできます
baseだけでなくderivedでも変更が可能な場合はprotectedに設定します.
継承にも種類があります
パブリック、保護済み、プライベート継承
継承タイプを指定しない場合は、デフォルトでプライベート継承を行います.
このセクションではpublic、private、protectedについて詳しく説明します.
パブリックおよびプライベートアクセス記述子を見たことがあります
共通メンバーはどこからでもアクセスでき、プライベートメンバーは同じクラスのメンバー関数からのみアクセスできます.
したがって、派生クラスからベースのプライベートメンバーに直接アクセスすることはできません.
The protected access specifier
protected access speciferはfriendクラスとderivedクラスでアクセス可能なメンバーです
でも外では近づけない
class Base
{
public:
int m_public {}; // can be accessed by anybody
protected:
int m_protected {}; // can be accessed by Base members, friends, and derived classes
private:
int m_private {}; // can only be accessed by Base members and friends (but not derived classes)
};
class Derived: public Base
{
public:
Derived()
{
m_public = 1; // allowed: can access public base members from derived class
m_protected = 2; // allowed: can access protected base members from derived class
m_private = 3; // not allowed: can not access private base members from derived class
}
};
int main()
{
Base base;
base.m_public = 1; // allowed: can access public members from outside class
base.m_protected = 2; // not allowed: can not access protected members from outside class
base.m_private = 3; // not allowed: can not access private members from outside class
return 0;
}
上記の例から、保護されたメンバーはderivedからアクセスできますが、mainなどの外部からアクセスできません.So when should I use the protected access specifier?
protectedのプロパティは派生クラスから直接アクセスできます
baseだけでなくderivedでも変更が可能な場合はprotectedに設定します.
So when should I use the protected access specifier?
継承にも種類があります
パブリック、保護済み、プライベート継承
継承タイプを指定しない場合は、デフォルトでプライベート継承を行います.
Public inheritance
class Base
{
public:
int m_public {};
protected:
int m_protected {};
private:
int m_private {};
};
class Pub: public Base // note: public inheritance
{
// Public inheritance means:
// Public inherited members stay public (so m_public is treated as public)
// Protected inherited members stay protected (so m_protected is treated as protected)
// Private inherited members stay inaccessible (so m_private is inaccessible)
public:
Pub()
{
m_public = 1; // okay: m_public was inherited as public
m_protected = 2; // okay: m_protected was inherited as protected
m_private = 3; // not okay: m_private is inaccessible from derived class
}
};
int main()
{
// Outside access uses the access specifiers of the class being accessed.
Base base;
base.m_public = 1; // okay: m_public is public in Base
base.m_protected = 2; // not okay: m_protected is protected in Base
base.m_private = 3; // not okay: m_private is private in Base
Pub pub;
pub.m_public = 1; // okay: m_public is public in Pub
pub.m_protected = 2; // not okay: m_protected is protected in Pub
pub.m_private = 3; // not okay: m_private is inaccessible in Pub
return 0;
}
Protected inheritance
Private inheritance
class Base
{
public:
int m_public {};
protected:
int m_protected {};
private:
int m_private {};
};
class Pri: private Base // note: private inheritance
{
// Private inheritance means:
// Public inherited members become private (so m_public is treated as private)
// Protected inherited members become private (so m_protected is treated as private)
// Private inherited members stay inaccessible (so m_private is inaccessible)
public:
Pri()
{
m_public = 1; // okay: m_public is now private in Pri
m_protected = 2; // okay: m_protected is now private in Pri
m_private = 3; // not okay: derived classes can't access private members in the base class
}
};
int main()
{
// Outside access uses the access specifiers of the class being accessed.
// In this case, the access specifiers of base.
Base base;
base.m_public = 1; // okay: m_public is public in Base
base.m_protected = 2; // not okay: m_protected is protected in Base
base.m_private = 3; // not okay: m_private is private in Base
Pri pri;
pri.m_public = 1; // not okay: m_public is now private in Pri
pri.m_protected = 2; // not okay: m_protected is now private in Pri
pri.m_private = 3; // not okay: m_private is inaccessible in Pri
return 0;
}
A final example
class Base
{
public:
int m_public {};
protected:
int m_protected {};
private:
int m_private {};
};
class D2 : private Base // note: private inheritance
{
// Private inheritance means:
// Public inherited members become private
// Protected inherited members become private
// Private inherited members stay inaccessible
public:
int m_public2 {};
protected:
int m_protected2 {};
private:
int m_private2 {};
};
class D3 : public D2
{
// Public inheritance means:
// Public inherited members stay public
// Protected inherited members stay protected
// Private inherited members stay inaccessible
public:
int m_public3 {};
protected:
int m_protected3 {};
private:
int m_private3 {};
};
上の例を見てよく知っておくReference
この問題について(17.5 Inheritance and access specifiers), 我々は、より多くの情報をここで見つけました https://velog.io/@ikmy0ung/17.5-Inheritance-and-access-specifiersテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol