在c++的继承控制中,有三种不同的控制权限,分别是public、protected和private。定义派生类时,若不显示加上这三个关键字,会使用默认的方式,用struct定义的类是默认public继承,class定义的类是默认private继承。这和Java有很大的不同,Java默认使用public继承,而且只有公有继承。
  1.使用public继承时,派生类内部可以访问基类中public和protected成员,但是类外只能通过派生类的对象访问基类的public成员。
  (1)基类的public成员在派生类中依然是public的。
  (2)基类中的protected成员在派生类中依然是protected的。
  (3)基类中的private成员在派生类中不可访问。
  2.使用protected继承时,派生类内部可以访问基类中public和protected成员,并且类外也不能通过派生类的对象访问基类的成员(可以在派生类中添加公有成员函数接口间接访问基类中的public和protected成员)。
  (1)基类的public成员在派生类中变为protected成员。
  (2)基类的protected成员在派生类中依然是protected成员。
  (3)基类中的private成员在派生类中不可访问。
  3.使用private继承时,派生类内部可以访问基类中public和protected成员,并且类外也不能通过派生类的对象访问基类的成员(可以在派生类中添加公有成员函数接口间接访问基类中的public和protected成员)。
  (1)基类的public成员在派生类中变成private成员。
  (2)基类的protected成员在派生类中变成private成员。
  (3)基类的private成员在派生类中不可访问。
  为了便于理解,我们用一个表格来说明这几种控制符使用的情况:
  派 生 方 式 基类的public成员 基类的protected成员 基类的private成员 public派生 还是public成员 变为protected成员 不可见 protected派生 变成protected成员 还是protected成员 不可见 private派生 变为private成员 变成private成员 不可见
  下面用代码简单叙述
  #include <iostream> 
  class Base { 
  public: 
  int public_a; 
  virtual void test() = 0; 
  protected: 
  int protected_a; 
  private: 
  int private_a; 
  }; 
  //公有继承 
  class PublicDerived : public Base { 
  public: 
  virtual void test() { 
  public_a = 1;                   //public_a public继承后还是public类型 
  protected_a = 2;                //protected_a 还是protected类型 
  //private_a = 3;                  //派生类不可访问基类私有成员 
  } 
  }; 
  //保护继承 
  class ProtectedDerived : protected Base { 
  public: 
  virtual void test() { 
  public_a = 1;                   //public_a protected继承后变为protected类型 
  protected_a = 2;                //protected_a 还是protected类型 
  //private_a = 3;                //派生类不可访问基类私有成员 
  } 
  }; 
  //私有继承 
  class PrivateDerived : private Base { 
  public: 
  virtual void test() { 
  public_a = 1;                   //public_a private继承后变为private类型 
  protected_a = 2;                //protected_a private继承后变为private类型 
  //private_a = 3;                //派生类不可访问基类私有成员 
  } 
  }; 
  在c++中public继承是is-a的关系。也说适用于基类身上的一定也适用于派生类身上,因为每一个派生类对象也都是一个基类对象。派生类对象转换为基类对象在需要的时候是可以自动转化的。