C++中三种继承方式

来源:互联网 发布:java登录界面设计代码 编辑:程序博客网 时间:2024/06/05 16:27

几重转载,不知原作出自何处


    我们知道类的private和protected成员,在类外是不可以使用的,只有public成员可以在类外直接使用。公有继承时,基类的private成员派生类也不可用,基类的public和protected成员在派生类中可直接使用。继承过来(变成派生类相应的public和protected成员)只有public成员在派生类外可以直接使用。

    保护继承时,基类的private成员仍为有私有,基类的public和protected成员变成派生类的protected成员,这时在派生类外也不能直接使用原基类的public成员。
    私有继承时,基类的private成员仍为有私有,基类的public和protected成员将变成派生类的private成员。
举个例子:

class A{  public:    int m_public;  protected:    int m_protected;  private:    int m_private;};class B :public A{   void SetPublic(int nPublic)   {       m_public = nPublic;   }   void SetProtected(int nProtected)   {       m_protected = nProtected;   }   void SetPrivate(int nPrivate)   {       m_private = nPrivate;       //错误,因为基类的private成员不能用   }};B b;                  //创建B类的对象cb.m_public = 100;     //正确b.m_protected = 100;  //错误,public继承中基类的protected在派生类中是protectedb.m_private = 100;    //错误,在派生类中都不可以直接使用,在类外就更不能了class C :protected A{   void SetPublic(int nPublic)   {       m_public = nPublic;   }   void SetProtected(int nProtected)   {       m_protected = nProtected;   }   void SetPrivate(int nPrivate)   {       m_private = nPrivate;       //错误,因为基类的private成员不能用   }};C c;                  //创建C类的对象cc.m_public = 100;     //错误,protected继承C类里变成了protected成员c.m_protected = 100;  //错误,protected继承C类里还是protected成员c.m_private = 100;    //错误,在派生类中都不可以直接使用,在类外就更不能了class D :private A{   void SetPublic(int nPublic)   {       m_public = nPublic;   }   void SetProtected(int nProtected)   {       m_protected = nProtected;   }   void SetPrivate(int nPrivate)   {       m_private = nPrivate;       //错误,因为基类的private成员不能用   }};D d;                  //创建D类的对象dd.m_public = 100;     //错误,private继承D类里变成了private成员d.m_protected = 100;  //错误,private继承D类里变成了private成员d.m_private = 100;    //错误,在派生类中都不可以直接使用,在类外就更不能了


从例子来看,三种继承从派生类内部引用来看好像没有区别,只在类外引用时表现不同。现在还看不出public和protected继承的区别
那再看一个例子:

class E :public B{   void SetPublic(int nPublic)   {      m_public = nPublic;        //正确  因为这是B类的公有成员   }   void SetProtected(int nProtected)   {      m_protected = nProtected;  //正确  因为这是B类的保护成员,现成变成E类的protected成员   }   void SetPrivate(int nPrivate)   {      m_private = nPrivate;      //错误,因为基类的private成员不能用   }};E e;                  //创建E类的对象ee.m_public = 100;     //正确e.m_protected = 100;  //错误,protected继承E类里变成了protected成员e.m_private = 100;    //错误,在派生类中都不可以直接使用,在类外就更不能了class F  :public C{      void SetPublic(int nPublic)   {      m_public = nPublic;         //正确 因为这是C类的protected成员   }   void SetProtected(int nProtected)   {      m_protected = nProtected;   //正确 因为这是C类的protected成员,现成变成F类的protected成员   }   void SetPrivate(int nPrivate)   {      m_private = nPrivate;       //错误,因为基类的private成员不能用   }};F f;                  //创建F类的对象ff.m_public = 100;     //错误,在C类里就已变成protected成员f.m_protected = 100;  //错误,protected继承E类里变成了protected成员f.m_private = 100;    //错误,在派生类中都不可以直接使用,在类外就更不能了class G  :public D{   void SetPublic(int nPublic)   {      m_public = nPublic;         //错误 因为这是D类的private成员   }   void SetProtected(int nProtected)   {      m_protected = nProtected;   //错误 因为这是D类的private成员   }   void SetPrivate(int nPrivate)   {      m_private = nPrivate;       //错误,因为基类的private成员不能用   }};//那G在类外就没有了可以引用的继承过来成员了


0 0
原创粉丝点击