继承和派生
继承的前提:分类
聚集(aggregation)
对于那些有明显层次之分的类,在构造后代类对象的时候,不是在其中包含一个前驱类对象,而是在前驱类对象的基础上,在其后面直接添加新的特征。这使得后代对象完全将前驱对象融合在自己内部,而且,每一个后代的前面部分就是一个完整的上一代前驱的对象
在C++和其它面向对象的语言中,聚集的实现过程被称为“继承(inheritance)”和“派生(derivation)”
继承的优点
使程序员可以不必重头开始编写下层类,而只是在上层类的基础上进行修改和扩展。这使得类的可重用性和可扩展性得到充分的体现。
继承和派生的概念
1.基本概念:基类和派生类
在最简单的情况下,如果说,一个类felid继承自类carnivore,那么通常将类carnivore称为“基类(base class) ”,或者“父类(parent class) ”;类felid称为carnivore类的“派生类(derived class) ”,或者“子类(child class) ”。
class 派生类名:access 基类类名//accsee为访问控制
{
…
};
继承基类的所有成员
派生类实际上包含了它所有基类中除了构造函数、析构函数和赋值运算符之外的所有成员(思考:why?)
2.改造基类成员
方式一 通过不同的派生方式改造基类成员
方式二 就是在派生类中声明与基类成员同名的成员来覆盖基类成员
3.增加新的成员
根据派生类的实际特征,增加不同于基类的成员
从编码的角度,派生类从基类中以较低的代价换来了较大的灵活性。一旦产生了可靠的基类,只需要调试派生类中所做的修改即可。派生类从基类继承属性时,可使派生类对其进行限制,也可以改变或隐藏。
eg:
class carnivore
{
};
class felid : public carnivore
{
public:
bool slitPupil;
};
class tiger : public felid
{
public:
void roar() {
std::cout << name << " roars" << std::endl; }
//other members
};
在上述的三代继承中,几个类构成了继承的类等级。其中,felid是tiger的“直接基类”,carnivore是tiger的“间接基类”,或者称为“祖先类”
这便就是类等级。
如果要在派生类的成员函数中使用祖先类的成员,可以用如下语法:
祖先类名::祖先类成员
但这样做是不能访问基类的私有成员的。(如果一定要访问呢?——用protected)
4.访问控制
正如在上面的代码中示意的那样,C++中,派生类的一般语法形式为