三種繼承方式的區別與聯繫

#include<iostream>
using namespace std;

class Base
{
public:
    void fun_1(){}
protected:
    void fun_2(){}
private:
    int x_;
};
class Derived :private Base
{
public:
    void fun_3()
    {
        fun_1();//私有繼承過來變爲自己的私有成員,在類內可以訪問
        fun_2();
    }
protected:
    void fun_4();
private:
    int y_;
};
class TT:private Derived
{
    void fun5()
    {
        //fun_1();//fun_1已經轉變爲了Derived的私有成員,無論怎麼繼承後面無法訪問。
    }
};
class Widget:public Base
{
    void fun()
    {
        //z_=x_;x_是Base的私有成員,即使在類內也無法訪問
        fun_2();//fun_2通過兩層繼承還是Widget的protected成員,在類內可以訪問
        /*protected和private成員的區別與聯繫:protected和private成員在類外均無法訪問,通過對象只能訪問public成員
          在類內自己的protected和private成員均可訪問,那麼區別在哪呢?就是當有繼承產生的時候(不管何種繼承方式),父類的private成員在
          子類類內是無法訪問的,但是protected是在子類類內是可以訪問的。
        */
    }
private:
    int z_;
};


class Person
{
public :
    virtual void print()
    {
        cout<<"Person"<<endl;
    }
};
class Student:public Person
{
public:
    void print()
    {
        cout<<"Student"<<endl;
    }
};

void MyPrint(Person& p)
{
    p.print();
}

int main()
{
    //運行時多態練習
    Person p;
    Student S;
    cout<<sizeof(p)<<endl;
    cout<<sizeof(S)<<endl;
    MyPrint(S);
    MyPrint(p);

    //繼承練習
    Derived d;
    d.fun_3();
    //d.fun_2();fun_2是Base的protected成員,通過公有繼承過來之後也是protected,通過對象無法訪問
    //d.fun_4();fun_4是Derived的protected成員,外部無法訪問
    return 0;
}

總而言之:

私有繼承時基類中各成員屬性均變爲private,並且基類中private成員被隱藏。派生類的成員也只能訪問基類中的public/protected成員,
而不能訪問private成員;派生類的對象不能訪問基類中的任何的成員。
保護繼承時基類中各成員屬性均變爲protected,並且基類中private成員被隱藏。派生類的成員只能訪問基類中的public/protected成員,
而不能訪問private成員;派生類的對象不能訪問基類中的任何的成員。 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章