1.继承
(1)公用继承基类的公有成员和保护成员在派生类中保持原有访问属性,其私有成员仍为基类私有。
(2)私有继承
基类的公有成员和保护成员在派生类中成了私有成员。其私有成员仍为基类私有。
(3)受保护的继承
基类的公有成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有(保护成员的意思是:不能被外界引用,但可以 被派生类的成员引用)。
在基类的访问属性 | 继承方式 | 在派生类中的访问属性 |
private(私有) | public(公用) | 不可访问 |
private(私有) | private(私有) | 不可访问 |
private(私有) | protected(保护) | 不可访问 |
public(公有) | public(公用) | public(公用) |
public(公有) | private(私有) | private(私有) |
public(公有) | protected(保护) | protected(保护) |
protected(保护) | public(公用) | protected(保护) |
protected(保护) | private(私有) | private(私有) |
protected(保护) | protected(保护) | protected(保护) |
2.派生类的构造函数
(1)简单的派生类的构造函数派生类构造函数一般形式为:
派生类构造函数名(总参数表):基类构造函数名(参数表)
{派生类中新增数据成员初始化语句}
例如:
Student1(int n,string nam,char s,int a,string sd):Student(n,nam,s)
{
age =a;
addr=ad;
}
其中Student1公用继承自Student,Student1中有age和addr两个私有数据成员,Student中有num,name,sex,三个私有数据成员。我们可以看到基类构造函数参数表列只有参数名而没有参数类型,因为在这里不是定义基类构造函数,而是调用基类构造函数,因此这些参数是实参而不是形参。
(2)有子对象的派生类的构造函数
类中的数据成员中还可以包含类对象,如可以在声明一个Student1类时包含这样的数据成员:Student s1;这时,s1就是类对象的内嵌对象,称为子对象。
此时定义派生类构造函数的一般形式为:
派生类构造函数名(总参数表):基类构造函数名(参数表),子对象名(参数表)
{派生类中新增数据成员初始化语句}
执行顺序是:首先调用基类构造函数,对基类数据成员初始化;然后调用子对象构造函数,对子对象数据成员初始化;最后执行派生类构造函数本身,对派生类数据成员初始化。
(3)多层派生时的构造函数
不要列出每一层派生类的构造函数,只需写出其上一层派生类(即它的直接基类)的构造函数即可。
3.使用派生类构造函数时的两种特殊形式:
(1)当不需要对派生类新增的成员进行任何初始操作时,派生类构造函数的函数体可以为空,即构造函数是空函数。例如:Student1(int n,string nam,int n1,string nam1):Student(n,nam),monitor(n1,nam1){}
(2)如果在基类中没有定义构造函数,或定义了没有参数的构造函数,那么,在定义派生类构造函数时可以不写基类构造函数。因 为此时派生类构造函数没有向基类构造函数传递参数的任务。在调用派生类构造函数时,系统会自动首先调用基类的默认构造函 数。