ホームページ データベース mysql チュートリアル Public Private Protect Inheritance and access specifiers

Public Private Protect Inheritance and access specifiers

Jun 07, 2016 pm 03:50 PM
private public

In the previous lessons on inheritance, we’ve been making all of our data members public in order to simplify the examples. In this div, we’ll talk about the role of access specifiers in the inheritance process, as well as cover the diff

In the previous lessons on inheritance, we’ve been making all of our data members public in order to simplify the examples. In this div, we’ll talk about the role of access specifiers in the inheritance process, as well as cover the different types of inheritance possible in C++.

To this point, you’ve seen the private and public access specifiers, which determine who can access the members of a class. As a quick refresher, public members can be accessed by anybody. Private members can only be accessed by member functions of the same class. Note that this means derived classes can not access private members!

1

2

3

4

5

6

7

class Base

{

private:

    int m_nPrivate; // can only be accessed by Base member functions (not derived classes)

public:

    int m_nPublic; // can be accessed by anybody

};

When dealing with inherited classes, things get a bit more complex.

First, there is a third access specifier that we have yet to talk about because it’s only useful in an inheritance context. The protected access specifier restricts access to member functions of the same class, or those of derived classes.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

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

}

Second, when a derived class inherits from a base class, the access specifiers may change depending on the method of inheritance. There are three different ways for classes to inherit from other classes: public, private, and protected.

To do so, simply specify which type of access you want when choosing the class to inherit from:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

// Inherit from Base publicly

class Pub: public Base

{

};

 

// Inherit from Base privately

class Pri: private Base

{

};

 

// Inherit from Base protectedly

class Pro: protected Base

{

};

 

class Def: Base // Defaults to private inheritance

{

};

If you do not choose an inheritance type, C++ defaults to private inheritance (just like members default to private access if you do not specify otherwise).

That gives us 9 combinations: 3 member access specifiers (public, private, and protected), and 3 inheritance types (public, private, and protected).

The rest of this div will be devoted to explaining the difference between these.

Before we get started, the following should be kept in mind as we step through the examples. There are three ways that members can be accessed:

  • A class can always access it’s own members regardless of access specifier.
  • The public accesses the members of a class based on the access specifiers of that class.
  • A derived class accesses inherited members based on the access specifiers of its immediate parent. A derived class can always access it’s own members regardless of access specifier.

This may be a little confusing at first, but hopefully will become clearer as we step through the examples.

Public inheritance

Public inheritance is by far the most commonly used type of inheritance. In fact, very rarely will you use the other types of inheritance, so your primary focus should be on understanding this div. Fortunately, public inheritance is also the easiest to understand. When you inherit a base class publicly, all members keep their original access specifications. Private members stay private, protected members stay protected, and public members stay public.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

class Base

{

public:

    int m_nPublic;

private:

    int m_nPrivate;

protected:

    int m_nProtected;

};

 

class Pub: public Base

{

    // Public inheritance means:

    // m_nPublic stays public

    // m_nPrivate stays private

    // m_nProtected stays protected

 

    Pub()

    {

        // The derived class always uses the immediate parent's class access specifications

        // Thus, Pub uses Base's access specifiers

        m_nPublic = 1; // okay: anybody can access public members

        m_nPrivate = 2; // not okay: derived classes can't access private members in the base class!

        m_nProtected = 3; // okay: derived classes can access protected members

    }

};

 

int main()

{

    // Outside access uses the access specifiers of the class being accessed.

    // In this case, the access specifiers of cPub.  Because Pub has inherited publicly from Base,

    // no access specifiers have been changed.

    Pub cPub;

    cPub.m_nPublic = 1; // okay: anybody can access public members

    cPub.m_nPrivate = 2; // not okay: can not access private members from outside class

    cPub.m_nProtected = 3; // not okay: can not access protected members from outside class

}

This is fairly straightforward. The things worth noting are:

  1. Derived classes can not directly access private members of the base class.
  2. The protected access specifier allows derived classes to directly access members of the base class while not exposing those members to the public.
  3. The derived class uses access specifiers from the base class.
  4. The outside uses access specifiers from the derived class.

To summarize in table form:

Public inheritance
Base access specifier Derived access specifier Derived class access? Public access?
Public Public Yes Yes
Private Private No No
Protected Protected Yes No

Private inheritance

With private inheritance, all members from the base class are inherited as private. This means private members stay private, and protected and public members become private.

Note that this does not affect that way that the derived class accesses members inherited from its parent! It only affects the code trying to access those members through the derived class.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

class Base

{

public:

    int m_nPublic;

private:

    int m_nPrivate;

protected:

    int m_nProtected;

};

 

class Pri: private Base

{

    // Private inheritance means:

    // m_nPublic becomes private

    // m_nPrivate stays private

    // m_nProtected becomes private

 

    Pri()

    {

        // The derived class always uses the immediate parent's class access specifications

        // Thus, Pub uses Base's access specifiers

        m_nPublic = 1; // okay: anybody can access public members

        m_nPrivate = 2; // not okay: derived classes can't access private members in the base class!

        m_nProtected = 3; // okay: derived classes can access protected members

    }

};

 

int main()

{

    // Outside access uses the access specifiers of the class being accessed.

    // Note that because Pri has inherited privately from Base,

    // all members of Base have become private when access through Pri.

    Pri cPri;

    cPri.m_nPublic = 1; // not okay: m_nPublic is now a private member when accessed through Pri

    cPri.m_nPrivate = 2; // not okay: can not access private members from outside class

    cPri.m_nProtected = 3; // not okay: m_nProtected is now a private member when accessed through Pri

 

    // However, we can still access Base members as normal through Base:

    Base cBase;

    cBase.m_nPublic = 1; // okay, m_nPublic is public

    cBase.m_nPrivate = 2; // not okay, m_nPrivate is private

    cBase.m_nProtected = 3; // not okay, m_nProtected is protected

}

To summarize in table form:

Private inheritance
Base access specifier Derived access specifier Derived class access? Public access?
Public Private Yes No
Private Private No No
Protected Private Yes No

Protected inheritance

Protected inheritance is the last method of inheritance. It is almost never used, except in very particular cases. With protected inheritance, the public and protected members become protected, and private members stay private.

To summarize in table form:

Protected inheritance
Base access specifier Derived access specifier Derived class access? Public access?
Public Protected Yes No
Private Private No No
Protected Protected Yes No

Protected inheritance is similar to private inheritance. However, classes derived from the derived class still have access to the public and protected members directly. The public (stuff outside the class) does not.

Summary

The way that the access specifiers, inheritance types, and derived classes interact causes a lot of confusion. To try and clarify things as much as possible:

First, the base class sets it’s access specifiers. The base class can always access it’s own members. The access specifiers only affect whether outsiders and derived classes can access those members.

Second, derived classes have access to base class members based on the access specifiers of the immediate parent. The way a derived class accesses inherited members is not affected by the inheritance method used!

Finally, derived classes can change the access type of inherited members based on the inheritance method used. This does not affect the derived classes own members, which have their own access specifiers. It only affects whether outsiders and classes derived from the derived class can access those inherited members.

A final example:

1

2

3

4

5

6

7

8

9

class Base

{

public:

    int m_nPublic;

private:

    int m_nPrivate;

protected:

    int m_nProtected;

};

Base can access it’s own members without restriction. The public can only access m_nPublic. Derived classes can access m_nPublic and m_nProtected.

1

2

3

4

5

6

7

8

9

class D2: private Base

{

public:

    int m_nPublic2;

private:

    int m_nPrivate2;

protected:

    int m_nProtected2;

}

D2 can access it’s own members without restriction. D2 can access Base’s members based on Base’s access specifiers. Thus, it can access m_nPublic and m_nProtected, but not m_nPrivate. Because D2 inherited Base privately, m_nPublic, m_nPrivate, and m_nProtected are now private when accessed through D2. This means the public can not access any of these variables when using a D2 object, nor can any classes derived from D2.

1

2

3

4

5

6

7

8

9

class D3: public D2

{

public:

    int m_nPublic3;

private:

    int m_nPrivate3;

protected:

    int m_nProtected3;

};

D3 can access it’s own members without restriction. D3 can access D2′s members based on D2′s access specifiers. Thus, D3 has access to m_nPublic2 and m_nProtected2, but not m_nPrivate2. D3 access to Base members is controlled by the access specifier of it’s immediate parent. This means D3 does not have access to any of Base’s members because they all became private when D2 inherited them.

http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers/

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Alter Tableステートメントを使用してMySQLのテーブルをどのように変更しますか? Alter Tableステートメントを使用してMySQLのテーブルをどのように変更しますか? Mar 19, 2025 pm 03:51 PM

この記事では、MySQLのAlter Tableステートメントを使用して、列の追加/ドロップ、テーブル/列の名前の変更、列データ型の変更など、テーブルを変更することについて説明します。

MySQL接続用のSSL/TLS暗号化を構成するにはどうすればよいですか? MySQL接続用のSSL/TLS暗号化を構成するにはどうすればよいですか? Mar 18, 2025 pm 12:01 PM

記事では、証明書の生成と検証を含むMySQL用のSSL/TLS暗号化の構成について説明します。主な問題は、セルフ署名証明書のセキュリティへの影響を使用することです。[文字カウント:159]

MySQLの大きなデータセットをどのように処理しますか? MySQLの大きなデータセットをどのように処理しますか? Mar 21, 2025 pm 12:15 PM

記事では、MySQLで大規模なデータセットを処理するための戦略について説明します。これには、パーティション化、シャード、インデックス作成、クエリ最適化などがあります。

人気のあるMySQL GUIツール(MySQL Workbench、PhpMyAdminなど)は何ですか? 人気のあるMySQL GUIツール(MySQL Workbench、PhpMyAdminなど)は何ですか? Mar 21, 2025 pm 06:28 PM

記事では、MySQLワークベンチやPHPMyAdminなどの人気のあるMySQL GUIツールについて説明し、初心者と上級ユーザーの機能と適合性を比較します。[159文字]

ドロップテーブルステートメントを使用してMySQLにテーブルをドロップするにはどうすればよいですか? ドロップテーブルステートメントを使用してMySQLにテーブルをドロップするにはどうすればよいですか? Mar 19, 2025 pm 03:52 PM

この記事では、ドロップテーブルステートメントを使用してMySQLのドロップテーブルについて説明し、予防策とリスクを強調しています。これは、バックアップなしでアクションが不可逆的であることを強調し、回復方法と潜在的な生産環境の危険を詳述しています。

JSON列にインデックスを作成するにはどうすればよいですか? JSON列にインデックスを作成するにはどうすればよいですか? Mar 21, 2025 pm 12:13 PM

この記事では、クエリパフォーマンスを強化するために、PostgreSQL、MySQL、MongoDBなどのさまざまなデータベースでJSON列にインデックスの作成について説明します。特定のJSONパスのインデックス作成の構文と利点を説明し、サポートされているデータベースシステムをリストします。

外国の鍵を使用して関係をどのように表現しますか? 外国の鍵を使用して関係をどのように表現しますか? Mar 19, 2025 pm 03:48 PM

記事では、外部キーを使用してデータベース内の関係を表すことで、ベストプラクティス、データの完全性、および避けるべき一般的な落とし穴に焦点を当てています。

共通の脆弱性(SQLインジェクション、ブルートフォース攻撃)に対してMySQLを保護するにはどうすればよいですか? 共通の脆弱性(SQLインジェクション、ブルートフォース攻撃)に対してMySQLを保護するにはどうすればよいですか? Mar 18, 2025 pm 12:00 PM

記事では、準備されたステートメント、入力検証、および強力なパスワードポリシーを使用して、SQLインジェクションおよびブルートフォース攻撃に対するMySQLの保護について説明します。(159文字)

See all articles