《C++ Primer》中如下解释公用、私有和受保护的继承,本人感觉很重要,也烦了不少错,觉得有必要记录下来。
C++ 对类所继承下来的成员的访问方式由基类中的成员访问级别和派生类的派生列表中使用的访问标号共同控制: (1)如果成员的基类中位private,则只有基类和基类的友元可以访问该成员。 派生类不能访问基类的private成员,也不能使自己的用户(即派生类的对象)访问那些成员。 (2)如果基类成员为public 和 protected,则派生列表中使用的访问标号决定该成员在派生类中的访问级别: ①如果是公用继承,基类成员保持自己的访问级别:基类的 public 成员为派生类的 public 成员,基类的protected 成员为派生类的 protected 成员。 ②如果是受保护继承,基类的 public 和 protected 成员在派生类中为 protected 成员。 ③如果是私有继承,基类的的所有成员在派生类中为 private 成员。 |
注意:(2)中的红色部分(即③)的含义与(1)中的红色部分是不一样的,一定区分清楚。基类的private成员,派生类及派生类对象是不可以对其访问的;而如果是私有继承下来的基类public 和 protected成员,在派生类中作为类本身的私有部分存在,也就是说,派生类的函数成员可以访问这段区域。
下面看代码:
#include<iostream>
using namespace std;
class Base
{
public:
void basemen(){};
protected:
int i ;
} ;
struct Public_derived :public Base
{
int use_base(){return i;}
} ;
struct Private_derivad: private Base
{
int use_base(){return i;} //“基类的所有成员函数在派生类中位private成员 ”
} ;
struct Derived_form_Private : public Private_derivad
{
//int use_base(){ return i; } //bug: “派生类不可以访问基类的private成员 ”
};
struct Derived_from_Public : public Public_derived
{
int use_base(){ return i; }
};
int main()
{
Base b ;
Public_derived d1;
Private_derivad d2;
b.basemen();
d1.use_base();
d2.use_base();
return 0;
}
这里的Private_derivad的use_base函数可以访问继承基类下来的 i,这里i作为Private_derivad类的一部分了,而Derived_form_Private继承Private_derivad时,i作为Private_derivad的私有部分,“派生类不能访问基类的private成员”。
至此,所有代码也就很好理解了。