主要区别:
- 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;
}