2013年12月9日月曜日

C++ 継承したメンバへのアクセス

今回は、継承したメンバのアクセス制限についての話です。

基底クラスでのpublicメンバの場合
基底クラスでpublicだったメンバは、派生クラスからは自分のクラスのメンバと
同じようにアクセスすることができます(^^)

class Food {
public:
    int GetPrice() { return price; }
};

class Vegetable : public Food {
public:
    void Vegetable::PricePrice() {
        cout << "Price = " << GetPrice() << endl;
    }
};

Vegetableクラスでは、基底クラスでpublicだったメンバ関数のGetPrice()に
アクセスしています。
基底クラスでpublicだったメンバは呼び出せるのです(^^)/


基底クラスでのprivateメンバの場合
基底クラスでprivateだったメンバは、派生クラスからはアクセスすることはできません。

class Food {
private:
    int m_price;
};

class Vegetable : public Food {
public:
    void Vegetalbe::PrintPrice() {
        cout << "Price = " << m_price << endl;
    }
};

基底クラスでprivateメンバにアクセスしようとすると、コンパイルエラーです。

そう、こんな風に(*´Д`)
test.cpp:12:10: error: extra qualification ‘Vegetable::’ on member ‘PrintPrice’ [-fpermissive]
test.cpp: In member function ‘void Vegetable::PrintPrice()’:
test.cpp:7:9: error: ‘int Food::m_price’ is private
test.cpp:13:31: error: within this context

基底クラスでprivateだったものは使えないのです(-_-;)


アクセス指定子のprotected
protectedを使用した場合は、派生クラスからアクセスできても
他のクラスやグローバルな関数からアクセスできなくなります。(^^;)

class Food {
protected:
    int m_price;
};

class Vegetable : public Food {
public:
    void Vegetable::PrintPrice() {
        cout << "Price = " << m_price << endl;  //これはOK
    }
};

int main(void)
{
    Vegetable vgt;
    vgt.PrintPrice();

    vgt.m_price = 200;
        :

例えば、こんな風に使おうとすると、コンパイルエラーになってしまいます...

そう、こんな感じで(*´Д`)
test.cpp:12:10: error: extra qualification ‘Vegetable::’ on member ‘PrintPrice’ [-fpermissive]
test.cpp: In function ‘int main()’:
test.cpp:7:9: error: ‘int Food::m_price’ is protected
test.cpp:22:9: error: within this context

アクセス指定子は、要注意ですね(^^;)
たまに、設計の意図を汲み取らず、これ public にしたいなぁという事はあるのですが...

今日の名言
心を傷つける鎖を断ち切り、悩みをきっぱりと捨て去った者は、幸福なるかな。
                           オウィディウス

明日を耐え抜くために必要なものだけ残して、あらゆる過去を閉め出せ。
                     サー・ウィリアム・オスラー

過ぎ去ったものは、もはや再び帰らない。賢者は現在と未来について考えるだけで
手一杯であるから、過ぎ去った事柄をくよくよ考えている暇がない。
                           フランシス・ベーコン

ジョージ・ハーバードは「夜は魂を脱ぎ捨てよ」と言っている。これは内省を
しろというのではなく、服を脱ぐようにすっぽりと魂を脱ぎ捨てるのだ。その
一日をなすこともなく過ごした罪も、誤りを犯した罪も、ともに脱ぎ捨てれば、
翌朝新しい命を持った新しい人間として、目覚めるだろう。
                     サー・ウィリアム・オスラー

恐ろしい悪夢に比べれば、現在の恐怖のほうがまだましだ。
                     ウィリアム・シェイクスピア