目录
一.继承的基本概念、定义派生类
面向对象的四个基本特征:抽象,封装,继承和多态,其中最主要的特征是继承和多态。
继承:可对类(class)分层,提供类型/子类型的一种机制。通过类派生(class derivation)的机制来支持继承。被继承的类称为基类(base class)或超类(superclass)或父类,新产生的类为派生类(derived class)或子类(subclass)。基类和派生类的集合称作类继承层次结构(hierarchy)。
目的:实现代码复用,以及为多态的实现提供了基础。
语法:
class 派生类名:访问限定符 基类名1,访问限定符 基类名2,……
例如,这就是最简单的单继承:
#include<iostream>
using namespace std;
class Base
{
};
//单继承 Base 称之为基类(父类、超类),Deriv称之为派生类(子类) ,
//public 称之为子类对父类的公有继承(访问限定符)
class Deriv :public Base
{
};
int main()
{
return 0;
}
编制派生类步骤:
- 吸收基类的成员 :不论是数据成员,还是函数成员,除构造函数与析构函数外全盘接收
- 改造基类成员 :声明一个和某基类成员同名的新成员,派生类中的新成员就屏蔽了基类同名成员称为同名覆盖(override)(同名隐藏
- 发展新成员 :派生类新成员必须与基类成员不同名,它的加入保证派生类在功能上有所发展。
- 重写构造函数与析构函数,派生类不继承这两种函数。
二.继承和访问的区别
作为子类会继承父类的所有(公有、私有和保护)信息吗?子类内部能访问父类的信息吗?对象能访问父类的信息吗?
继承不等价于访问(使用)。例如 遗传学上的隐式现象,虽然继承了相关基因但是成长中没有显现出来。
子类可以继承父类的所有信息(从内存的角度看,继承相当于把父类的除了构造和析构函数外的所有信息拷贝到子类中)。
但是,继承和访问不能混为一谈,访问可以从来两个角度看:在子类内部对父类信息的访问,对象对父类信息的访问。
#include<iostream>
using namespace std;
class Base
{
private:
int x;
};
class Deriv :private Base //public换为private 程序结果也相同。
{
private:
int y;
};
int main()
{
cout<<sizeof(Base)<<endl;
cout<<sizeof(Deriv)<<endl;
return 0;
}
三.访问限定符
子类对父类的访问限定(也称继承方式):public、private 和protected,如果不写的话,默认是私有访问限定。
之前的学习,我们知道:对象只能访问类的公有成员(函数和数据),而不能直接访问私有或保护成员。
有了继承的概念后,我们就需要讨论:子类内部能访问父类的哪些信息,子类的对象能访问父类的哪些信息,
而这些与子类对父类的访问限定(public、private 和protected)有关系。
不论子类对父类使用什么访问限定(public、private 和protected)的继承:
a:子类不能访问父类的构造函数和析构函数(类比:小狗不能继承狗爸爸出生和死亡)
b:在子类中无法直接访问父类中的私有信息(函数和数据),父类的私有信息被隐藏了。
c:子类的对象无法访问子类和父类中的私有或保护信息。
公有继承的情况下:相当于把父类中除了构造和析构函数外的其他信息都拷贝到子类中,这些信息在子类中的访问限定符为各自原来的限定符。
在子类中可以直接访问父类中的公有和保护方法(这其实就是保护和私有的区别。)
子类的对象只可以访问父类的公有成员,但不能访问保护和私有成员。
保护继承情况下:保护继承相当于:把父类的信息拷贝过来,其限定符为protected,但是经过限定符的叠加之后,
原来限定符public变为protected,protected和private保持不变 。
a: 在子类中可以访问父类的公有和保护成员
b: 子类中和对象中都不可访问父类的私有成员
c: 子类的对象只能访问自身的公有成员,不能访问父类的公有成员,因为此时的父类的公有成员在子类中已经变为保护成员了。
私有继承情况:私有继承相当于:把父类的信息拷贝过来,其限定符为private,但是经过限定符的叠加之后,
原来限定符public和protected变为private,原来的private保持不变 。
a: 在子类中可以访问父类的公有和保护成员,尽管可看做其已经成为子类的私有成员了
b: 子类中和对象中都不可访问父类的私有成员
c: 子类的对象只能访问自身的公有成员,不能访问父类的公有成员、保护和私有成员。
四.保护继承和私有继承的区别
私有继承从感觉上看阻止了父类再向下继承(表现在孙子类不能访问爷爷类的公有成员了。但实质上继承是可以的)
但是,保护继承的孙子类可以访问爷爷类的公有成员。