读书笔记--继承

来源:互联网 发布:十元夺宝源码 编辑:程序博客网 时间:2024/05/17 08:37

  对类所继承的成员的访问由基类中的成员访问级别和派生类派生到列表中使用的访问标号共同控制。
  公用继承:基类成员保持自己的访问级别,基类的publci成员为派生类的public,protected,private成员均未改变。
  保护继承:基类的public和protected成员在派生类中为protected成员
  私有继承:基类的所有成员在派生类中为private成员
class Base
{
 public:
  void Basemen();
 protected:
  int i;
};

class Public_derived:public Base
{
 public:
  int UseBase()                 //OK
  {
   return i;
  }       
};

class Private_derived:private Base
{
 public:
  int UseBase()      //OK
  {
   retirn i;
  }
};
无论派生类列表中是什么访问标号,所有继承Base的类对Base中public成员具有相同的访问

Base b;
Public_derived d1;
Private_derived d2;
b.basemen();               //OK:basemen is public
d1.basemen();              //OK:basemen is public
d2.basemen();              //error:base is private

可通过using来改变成员的访问级别
class Derived:public Base
{
 public:
  using Base::size;
 protected:
  using Base::n;
};

struct的默认继承访问级别为public,class则为private.类似于成员保护级别的规定(在struct中,默认的为private,而struct为public)
class Base
{...};
struct D1:Base           //publci
{...};            
class D2:base            //private
{...};                

友元可以访问类的private和protected数据,但友元关系不能继承。
class Base
{
 friend class Frnd;          
 protected:
  int i;
};

//Frnd has no access to menber in D1
class D1:public Base
{
 protected:
  int j;
};

class Frnd
{
 public:
  int men(Base b)        //OK:Frnd is friend to Base
  {
   return b.i;
  }
  int men(D1 d)     //error:frined ship doesn't inherits
  {
   return d.i;
  }
};

//D2 has no access to member in Base
class D2:public Frnd
{
 public:                    //error:frined ship doesn't inherits
  int men(Base b)    
  {
   return b.i;
  }
}

如果基类定义了static成员,则整个继承层次中只有一个这样的成员
struct Base
{
 static void statmen();         //public by default
};

struct Derived:Base
{
 void f(const Derived &);
}

void Derived::f(Derived &derived_obj)
{
 Base::statmen();        //OK:Base defines statmen
 Derived::statmen();     //OK:Derived inherits statmen
 
 //OK:derived objects can used to access static from base
 derived_obj.statmen();   //accessed through Derived object
 statmen();               //accessed through this class
}