質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3848閲覧

C++のクラスのアクセス修飾について

ninogojo32

総合スコア18

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2015/11/23 06:51

c++

1class base 2{ 3protected: 4 int a=0; 5}; 6 7class base2 : public base 8{ 9public: 10 void A(base *b) 11 { 12 printf("%d", b->a); 13 } 14}; 15

上記のようなコード(実際には、ヘッダーとソースファイルに分けてあります)をビルドしようとしたところ、”baseで宣言されているprotectedメンバーのaにはポインタ及びオブジェクトから参照できない”というむねのエラーコードを吐き、ビルドできませんでした。

以前

c++

1class base 2{ 3private: 4 int a=0; 5 6public: 7 void A(base *b) 8 { 9 printf("%d", b->a); 10 } 11};

という感じのコードはビルドできていたので、てっきり前者のコードもビルドできると勘違いしていました。

ここで質問なのですが、前者のようなコードはどうしてビルドできないのでしょうか?
protectedとはそのフィールドを持つクラスから派生したクラスにおいてアクセス可能ということを示すものではないのでしょうか?
解説をお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

private/protectedは派生クラスのthisからアクセスできるかどうかを示しているだけで、他のインスタンスからは両方直接アクセスできません。
ただし、同一クラスのメンバ関数内であればthis以外のインスタンスにもアクセスできます。

2番目の例はbaseクラス内でbaseクラスのインスタンス変数にアクセスしているのでこれは可能です。
1番目の例はbase2クラスから見て渡されたbaseクラスのインスタンスがbase2とは限らない(baseを継承した他のクラスかもしれない)ためエラーになります。

投稿2015/11/23 08:44

編集2015/11/23 12:52
toki_td

総合スコア2850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ninogojo32

2015/11/23 14:32

わかりやすい解説をありがとうございます。とても参考になりました。
guest

0

protectedとはそのフィールドを持つクラスから派生したクラスにおいてアクセス可能ということを示すものではないのでしょうか?

そのとおりです。protected変数は派生クラス内で参照することができます。

c++

1 void A(base *b) 2 { 3 printf("%d", b->a); 4 }

しかし、上記の"b->a"では、他のインスタンス変数を参照しているので、エラーとなります。
通常のメンバー変数と同様にして参照します。

C++

1 void A() 2 { 3 printf("%d", a); 4 }

投稿2015/11/23 08:45

編集2015/11/23 08:46
akiruno-oneone

総合スコア815

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ninogojo32

2015/11/23 14:34

回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問