《C++ Prime Plus》(7)

访问控制:protected

 保护类像是其他两个访问控制类private(私有),public(公共)的结合体。在基类中使用protected定义的成员和方法,对于外界来说跟private定义的成员和方法无异;但是对于基类派生的类来说,protected定义的成员和方法跟public无异。

抽象基类

 《C++ Prime Plus》中介绍了这样一个例子:对于圆和椭圆这两个概念,由于圆可以看成椭圆的一个特例。因此在定义这两个概念时,我们会习惯性的将椭圆定义为基类,从椭圆类中派生出圆类。这样做理论上没有什么问题,但是由于定义一个圆只需要两个参数——圆心和半径,而椭圆类中则包含了太多圆不需要的参数,这使得直接定义圆这个类比从椭圆中派生出圆类要简洁的多。对于这种理论上具有派生关系,但是实际上分开定义更加合适的基类与派生类,C++还提供了一种解决方法——抽象基类。

 从这两个类中抽象出他们的共性放在一个抽象基类(Abstract Base Class, ABC)中,这里的共性指的是函数方法。这样做的一个好处是可以通过指向ABC的指针数组来同时管理上述两个类(上节提到的多态性)。由于抽象基类中没有数据成员,只有函数方法,因此抽象基类中只能声明方法,无法对其进行实现。C++通过使用纯虚函数来允许类声明不提供实现的方法。定义纯虚函数只需在虚函数结尾处添加=0即可,下面的语句块中展示了几种定于纯虚函数的实例。

1
2
3
4
5
class BaseClass{
public:
virtual func2(int, int) = 0;
virtual func3(int, int) const = 0;
}

 除了虚函数,普通函数结尾处也可以添加=0以表明不需要对这个函数提供函数实现。不同之处在于对于纯虚函数不要提供函数实现,而普通函数后添加=0仍可以提供函数实现。这是因为,当基类中的方法和派生类中的方法相同时,在基类中按照普通函数进行声明,此时可以在基类中直接提供函数实现。当基类中的方法和派生类中的方法不通过时,我们会在基类中按照虚函数进行声明,此时不必再基类中直接提供函数实现。

 包含纯虚函数的基类无法实例化对象,这使得抽象基类成为一个专门用于生产派生类的基类。至少有一个虚函数是纯虚函数才能是包含它的类成为抽象基类。

 有了抽象基类,就能从其中派生出各种所需的类,这样这些派生类都会具有从基类那里继承而来的共性,此外还能够自定义所需的新的特性。


转载请注明来源:©Tinshine