輝々凛々

ガンバるってことは、素晴らしい事だ。

未知との衝撃

C++な話なんですが。

Baseクラスをpublic継承してDerivedクラスを作ります。
そのとき、DerivedクラスからBaseクラスのpublicメンバとprotectedメンバが見れますよね?

だけど、見れないときもあります。

次の例を見てください。

class Base
{
 protected:
  int data;

 public:
  Base(void) {};
  ~Base(void) {};
};

class Derived : public Base
{
 public:
  Derived(void) {};
  ~Derived(void) {};

  void f(void)
  {
    data = 0;

    Base * base = this;
    base->data = 2; // access error!!
  }
};

int main(void)
{
  Derived d;
  d.f();
  return 0;
}



さて、これはコンパイルエラーです。
コンパイルエラーが起きるのは、「access error」と書いたところです。
なぜアクセス権限エラーが起きるのでしょう?

DerivedクラスはBaseクラスをpublic継承しているので
protectedなメンバdataにアクセスする権限はあるはずです。

ところがリアルにコンパイルエラーが起きます。
(一応、VC7.1使用です。その他環境では調べていませんが、
 おそらくコンパイルエラーです)


これ、ちょっと考えたのですけど。
明確な答えを持っているわけではないので、話半分で聞いていただきたいのですが

件のbase->dataとしてアクセスしている部分。
これ、Baseクラスの変数を使っているからアクセスできないのです。
いくら子クラスであるDerivedクラスとはいっても、
自分を使わずに親クラスのprotectedメンバにはアクセスできないのです。

つまり、親クラスのprotectedなメンバにアクセスしたいなら
this->dataとしてアクセスするしかないのです。


たぶん。
いや、いつも中途に終わってしまうけど、
いつもわかってないんだから仕方がないってことで。

とりあえず、メモ程度に書いておきます。




関連記事

ツッコミの投稿


(ツッコミ非公開の場合はチェック)