原文链接
1.归纳表格
继承方式 | 基类的public成员 | 基类的protect成员 | 基类的private成员 | 继承引起的访问控制权变化 |
---|---|---|---|---|
public继承 | 仍为public成员 | 仍为protected成员 | 不可见 | 基类的非私有成员在子类的访问属性都不变 |
protected继承 | 变为protected成员 | 仍为protected成员 | 不可见 | 基类的非私有成员都成为子类的保护成员 |
private继承 | 变为private成员 | 变为private成员 | 不可见 | 基类的非私有成员都成为子类的私有成员 |
2.举个例子
#include<iostream>
using namespace std;
class Base {
private:
int _priB;
protected:
int _proB;
public:
int _pubB;
Base(int pri, int pro, int pub) {
cout << "Construct Base " << endl;
_priB = pri;
_proB = pro;
_pubB = pub;
}
};
class A :public Base {
public:
A(int pri, int pro, int pub) :Base(pri, pro, pub) {
cout << "Construct A " << endl;
}
void showInfo() {
//cout << _priB << endl; //error,基类私有成员在派生类中不可见
cout << _proB << endl; //ok,仍为protected成员
cout << _pubB << endl; //ok,仍为public成员
}
};
class B :protected Base {
public:
B(int pri, int pro, int pub) :Base(pri, pro, pub) {
cout << "Construct B " << endl;
}
void showInfo() {
//cout << _priB << endl; //error,基类私有成员在派生类中不可见
cout << _proB << endl; //ok,仍为protected成员
cout << _pubB << endl; //ok,变为protected成员
}
};
class C :private Base {
public:
C(int pri, int pro, int pub) :Base(pri, pro, pub) {
cout << "Construct C " << endl;
}
void showInfo() {
//cout << _priB << endl; //error,基类私有成员在派生类中不可见
cout << _proB << endl; //ok,变为private成员
cout << _pubB << endl; //ok,变为private成员
}
};
void main() {
A a(1, 2, 3);
B b(4, 5, 6);
C c(7, 8, 9);
cout << a._pubB << endl; //ok,仍为public成员
//cout << b._pubB << endl; //error,变为protected成员
//cout << c._pubB << endl; //error,变为private成员
a.showInfo();
b.showInfo();
c.showInfo();
}
总结:
- public继承是一种接口继承,基类可用的成员对子类也是可用的
- 如果基类的成员不想再类外访问,但要在派生类中访问,就定义为protected
- 不管是哪种继承,基类的私有成员在派生类中是不可见的
- class的默认继承方式是private,struct的默认继承方式是public
- 实际应用中一般用public继承