【C++基礎】公有,私有和受保護的繼承

王曉斌發表於2014-02-07

對類所繼承的成員的訪問由基類中的成員訪問級別和派生類派生列表中使用的訪問標號共同控制。


派生類可以進一步限制但不能放鬆對所繼承的成員的訪問


  • public inheritance:基類成員保持自己的訪問級別:基類的public成員為派生類的public成員,基類的protected成員為派生類的protected成員。
  • protected inheritance:基類的public和protected成員在派生類中為protected。
  • private inheritance:基類的所有成員在派生類中為private成員。


示例:

class Base
{
public:
    void basemen();                // public member
protected:
    int i;                         // protected member
	// ...
};

struct Public_derived : public Base
{
    int use_base() {return i;}     // ok; derived classes can access i
	// ...
};

struct Private_derived : private Base
{
    int use_base() {return i;}    // ok; derived classes can access i
};

Base b;
Public_derived d1;
Private_derived d2;
b.basemen();                     // ok;
d1.basemen();                    // ok; basemen is public in the derived class
d2.basemen();                    // error; basemen is private in the derived class


struct Derived_from_Private : public Private_derived
{
    // error; Base::i is private in Private_derived
	int use_base() {return i;}
};

struct Derived_from_Public : public Public_derived
{
    // ok; Base::i remains protected in Public_derived
	int use_base() {return i};
};


private inheritance:

  • private繼承是實現繼承,不是介面繼承;
  • 如果classes之間的繼承關係是private,編譯器不會自動將一個derived class物件轉換為一個base class物件;
  • private繼承並不意味著is-a關係;
  • private繼承在軟體設計層面上沒有意義,其意義只及於軟體實現層面;

class Base  {  }; 
class Derived : private Base {  };

void test(Base* rhs){}

Base b;
Derived d;

test(&b); // ok;
test(&d); // error;



相關文章