最近在看effective C++,看到第六部分——继承与面向对象设计,对类成员访问级别(public,protected,private)与继承的形式(public, private)的有时候会有点迷糊,这里理清一下思路。
我觉得首先要弄清楚,类的定义和类的使用。
简单来说,类的定义就是设计类里面应该有什么成员函数,什么数据,以及成员函数的实现。而类的使用是通过定义好的类来产生对象,及定义一个类的对象,便能够使用类(当然也可以是指针和引用)。
对于类成员的访问级别有public,protected,private。那么什么时候需要访问类呢?我觉得有两种情况,第一种是我定义一个类的对象,指针,引用(这也是我们说的类的使用),第二种是子类定义的时候。
对于第一种:在我们定义一个类的对象的时候,我们通过对象来发挥出类的功能,但是我们只能访问级别为public的成员函数和变量。
对于第二种:在子类的定义的时候,我们能够使用父类的public和protected成员函数和变量。
所以,private成员函数和变量只能在类自己定义的过程中使用。
那么问题来了,对于子类的对象来说,我们能访问哪些函数呢?
这里我们看看继承的形式。继承的形式常用的有两种(public和private)(一般很少用protected继承,这里不讨论了)。我们假设基类为class Base, 子类为 class Derived.
1、如果子类(Derived)通过public继承了基类Base。
Base类的访问级别 ----- public继承------ 子类对象(不是子类定义)看到的级别
public public
protected protected
private private
因此子类对象只能访问父类Base中的public 成员函数和数据。但是子类定义的过程中,我们能够使用父类的public和protected成员函数和变量。
2、如果子类(Derived)通过private继承了基类Base。
Base类的访问级别 ----- private继承------ 子类对象(不是子类定义)看到的级别
public private
protected private
private private
因此子类对象无法访问父类Base中的所有成员函数和变量。但是子类定义的过程中,我们仍然能够使用父类的public和protected成员函数和变量。
所以,我觉得在准备一个类的成员函数和变量时,一定区分清楚到底是在哪儿用?是在类的定义中(那么此时你是功能的提供者),还是类的对象(此时你是功能的使用者)。