学习C++时经常被三类权限以及继承权限搞得晕头转向,下定决心一次搞懂。
注:看懂此篇文章就可以扔掉所谓的权限转化表了。
public,protected和private
一、访问权限
首先了解一下三类访问权限:
public的变量和函数在类的内部外部都可以访问。
protected的变量和函数只能在类的内部和其派生类中访问。
private修饰的元素只能在类内访问。
方便理解,我将上述提到的权限访问范围问题分为三类:
以下三类理解说明麻烦解决了一半了
- 本类可访问
- 子类可访问(传递性,即这个成员可以在子类存在,可被继承)
- 外界可访问(对外性,即可通过类对象访问)
需要在此特殊记忆一下,因为三者都在本类可访问,所以这个方面就不用细说了。在此说一下区别。我会将对外性和传递性两类访问性在文章中标红。
这块属于重点
public成员 具有对外性和传递性(即其可被子类继承)。
protected成员 具有传递性。
private成员 失去了其两者性质。
理解以上问题后接着向下看。
二、继承权限
通过继承,我们可以修改并继承父类成员,但首先要满足的条件:父类成员具有传递性。这也是为什么private成员在子类中不可见的原因,因为它失去了传递性。
以下简单介绍一下三类继承:
public继承
公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,都保持原有的状态,而基类的私有成员任然是私有的,不能被这个派生类的子类所访问。
protected继承
保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元函数访问,基类的私有成员仍然是私有的
private继承
私有继承的特点是基类的所有公有成员和保护成员都成为派生类的私有成员,并不被它的派生类的子类所访问,基类的成员只能由自己派生类访问,无法再往下继承。
简单叙述一下:三种继承方式就相当于,在子类中给父类成员统一分配一个访问权限。举例如下:
先这么理解,接着向下看。
class Base{
public:
int a;
protected:
int b;
private:
int c;
};
class Derived : public Base {
//以pubic方式继承即是说 基类所有成员在子类为public权限成员
public:
// Base::a;
// Base::b;
// C成员不具有传递性 所以不可见,上面提到了
};
这样分配肯定是不行的,因为这样会破坏父类的封装特性(我访问不了父类,我直接产生个子类不就好了)
那这里的问题应该怎么理解:
重点理解以下两句:
1.基类的成员访问权限决定了派生类中该成员访问权限的下限。
即我们不能为父类增添某些权限,比如我们不能为父类private成员增加传递性来访问它
比如我们不能通过任何继承方式增添父类protected成员的对外性(将父类protected成员在子类改为public)。(使用public继承,以下编译器报错)
2.对基类的继承权限可改变派生类中该成员访问权限的上限。
即我们可以减少父类成员的权限,比如我们可以剪切父类public成员的对外性,使其无法再进行类成员访问。
修改一下代码,当前子类使用protected继承,而后再派生一个子类。
class Base{
public:
int a;
protected:
int b;
private:
int c;
};
class Derived : protected Base {
protected:
void fun() {
a = 10;
b = 20;
c = 30;
}
};
出现以下情况,父类public成员的对外性没有了,
以下再举一个例子,大家可自行测试。
以private方式继承,查看子类的子类中基类成员的传递性。
总结
三类权限还有三类作用范围,对应类内、类外和子类中。抓住这三个范围去理解更加轻松。