天天看點

C++文法基礎--恢複繼承成員的通路級别,預設繼承保護級别,友元關系與繼承,繼承與靜态成員

1.恢複繼承成員的通路級别(using 聲明)

 *派生類可以恢複繼承成員的通路級别,但是不能使通路級别比基類中原來指定的更嚴格或更寬松

Example:

  class base

  {

      public:

   int x;

  };

   class private_derived:private base   

   {

    public:

       using base::x;

   };

 int main()

 {

  private_derived pd;

  pd.x=1;// 如果去除using base::x,則出錯: 'int base::x' is inaccessible 

  cout<<pd.x<<endl;//1

 }

2.預設繼承保護級别

  *class保留字定義的派生類預設具有private繼承

  *struct保留字定義的派生類預設具有public繼承

 Example:

  class base

  {

  };

   class private_derived: base   

   {

   };

 等效于

  class private_derived: private base   

   {

   }; 

3.友元關系與繼承

  *友元關系不能繼承,基類的友元對派生類的成員沒有特殊通路權限

   Example:

   class base

  {

    friend class frd;

    public:

    base(int i):x(i)

    {

    }

    private:

    int x;

  };

   class derived: public base   

   {

    public:

       derived(int j):base(j)

   {

            } 

     private:

    int y;

   };

  class frd   

   {

    public:

    void fun1(base b)

    {

    cout<<"base:: "<<b.x<<endl; 

    }

    void fun2(derived d)

    {

    //cout<<"derived:: "<<d.y<<endl;//error, 'int derived::y' is private

    }

   }; 

 int main()

 {

  base b(1);

  derived d(2);

  frd f;

  f.fun1(b);//base:: 1

    return 0;

 }

4.繼承與靜态成員

  *如果基類定義了static成員,則整個繼承層次中隻有一個這樣的成員

  *static成員遵循正常通路控制

 Example:

  class base

  {

    public:

    static void fun()

    {

    cout<<"static base::fun()"<<endl;

    }

  };

   class derived: public base   

   {

   };

 int main()

 {

  derived d;

  derived *pd=new derived;

  derived::fun();//static base::fun()

  d.fun();//static base::fun()

  pd->fun();//static base::fun()

    return 0;

 }

繼續閱讀