继承与派生
三种继承方式:
实际这里一共有三种方式,分别是公有继承、私有继承、保护继承。
不同的继承方式,主要区别在于基类中不同访问权限的成员在派生类中的访问权限变化情况。
公有继承的模式下,标识符为public,特点如下:
-
基类中的公有成员,在派生类中仍然为公有成员。当然无论派生里的成员函数还是派生类对象都可以访问。
-
基类中的私有成员,无论在派生类的成员还是派生类对象都不可以访问。
-
基类中的保护成员,在派生类中仍然是保护类型,可以通过派生类的成员函数访问,但派生类对象不可以访问!
第二种,私有继承。
在私有继承的情况下,公有类型、私有类型、受保护类型三种成员的访问权限如下:
-
基类的公有和受保护类型,被派生类私有继承吸收后,都变为派生类的私有类型,即在类的成员函数里可以访问,不能在类外访问。
-
而基类的私有成员,在派生类无论类内还是类外都不可以访问。
可以看出来,如果为私有派生,则基类的私有成员在派生类甚至再派生出的子类中,都无法再使用。没有什么存在意义,故这种使用情况比较少。
第三种,保护继承
保护类型的继承,特点如下:
-
基类的公有成员和保护类型成员在派生类中为保护成员。
-
基类的私有成员在派生类中不能被直接访问。
可以看的出来在保护继承模式下,派生类里的成员函数可以访问基类的公有成员和保护成员,但在类外通过派生类对象则无法访问它们。同样,无论派生类里的成员函数还是通过类对象都无法访问基类中的私有成员。
我们可以总结如下:
-
基类私有成员,无论什么派生权限,派生类内成员函数和类外都是不可以访问的。
-
私有继承,无论基类原来什么类型,在派生类外通过成员函数都不可以访问。
-
派生类从基类中吸收的成员的访问权限为基类中访问权限和派生时派生权限两者之中最低的一种。
派生类的构造函数
派生类包含基类的原因,我们在创建一个派生类的时候,系统会先创建一个基类。需要注意的是,派生类会吸纳基类的全部成员,但并不包括构造函数及析构函数,那么就意味着创建派生类在调用自己的构造函数之前,会先调用基类的构造函数。
可以用以下代码测试以下:
#include<iostream>
using namespace std;
class Clock
{
private:
int H;
int M;
int S;
public:
Clock()
{
cout<<"Clock's Constructor Called!"<<endl;
}
Clock(int h,int m,int s)
{
this->H = h