主要区别:
- public继承时,基类的private成员对派生类不可见,基类的public成员、protected成员相应地变成派生类的public、protected成员;
- private继承时,基类的private成员对派生类不可见,基类的public成员、protected成员变成派生类的private成员;
- protected继承时,基类的private成员对派生类不可见,基类的public成员、protected成员变成派生类的protected成员。
更详细的访问权限:
| 访问权限 | 基类的 public成员 |
基类的 private成员 |
基类的 protected成员 |
|
|---|---|---|---|---|
| 基类 | 类内部 | 可见 | 可见 | 可见 |
| 友元(通过基类对象访问) | 可见 | 可见 | 可见 | |
| 实例化对象(基类的使用者) | 可见 | 不可见 | 不可见 | |
| 派生类内部 | public派生类 | 可见 | 不可见 | 可见 |
| private派生类 | 可见 | 不可见 | 可见 | |
| protected派生类 | 可见 | 不可见 | 可见 | |
| 派生类的友元 | public派生类 | 可见 | 不可见 | 不可见 |
| private派生类 | 可见 | 不可见 | 不可见 | |
| protected派生类 | 可见 | 不可见 | 不可见 | |
| 派生类的实例化对象 | public派生类 | 可见 | 不可见 | 不可见 |
| private派生类 | 不可见 | 不可见 | 不可见 | |
| protected派生类 | 不可见 | 不可见 | 不可见 |
访问权限测试代码:
#include <iostream>#include <algorithm>using namespace std;class A{friend void print0(const A& a){cout << a.x1 << a.x2 << a.x3 << endl;}public:int x1;A():x1(1), x2(2), x3(3){}private:int x2;protected:int x3;};class B: public A{friend void print1(const A& a){cout << a.x1 << endl;//cout << a.x2 << endl;//cout << a.x3 << endl;}public:B(){cout << x1 << endl;//cout << x2 << endl;cout << x3 << endl;}};class C: private A{friend void print2(const A& a){cout << a.x1 << endl;//cout << a.x2 << endl;//cout << a.x3 << endl;}public:C(){cout << x1 << endl;//cout << x2 << endl;cout << x3 << endl;}};class D: protected A{friend void print3(const A& a){cout << a.x1 << endl;//cout << a.x2 << endl;//cout << a.x3 << endl;}public:D(){cout << x1 << endl;//cout << x2 << endl;cout << x3 << endl;}};int main(){A a;a.x1;//a.x2;//a.x3;B b;b.x1;//b.x2;//b.x3;C c;//c.x1;//c.x2;//c.x3;D d;//d.x1;//d.x2;//d.x3;}
