继承(inheritance)与派生
1、 定义:继承就是在一个已经存在的类的基础上建立一个新的类,已经存在的类称为基类(base class)或者父类(father class),新建的类称为派生类(derived class)或者子类(son class)。
一个派生类之从一个基类派生,称为单继承(single inheritance);
一个派生类有两个或者多个基类,称为多重继承(multiple inheritance);
2、 派生类的声明方式
class student
{
public:
protected:
int m_num;
string m_name;
char m_sex;
};
class stu:protected student
{
public:
void get_value();
void display();
protected:
int m_age;
string m_addr;
};
即:
Class 派生类名:[继承方式] 基类名
{
派生类新增加的成员;
};
其中,继承方式包括public(共有的)、private(私有的)、protected(受保护的),继承方式是可选的,如果不写此项,则默认为私有的。
3、 派生类的构成:从基类继承过来的成员(不包括构造函数和析构函数)和自己增加的成员。
4、 基类成员在派生类中的访问属性
在基类的访问属性 |
继承方式 |
在派生类中的访问属性 |
private(私有) |
public(公用) |
不可访问 |
private(私有) |
private(私有) |
不可访问 |
private(私有) |
protected(保护) |
不可访问 |
public(公用) |
public(公用) |
public(公用) |
public(公用) |
private(私有) |
private(私有) |
public(公用) |
protected(保护) |
protected(保护) |
protected(保护) |
public(公用) |
protected(保护) |
protected(保护) |
private(私有) |
private(私有) |
protected(保护) |
protected(保护) |
protected(保护) |
5、 派生类中的成员的访问属性
派生类中访问属性 |
在派生类中 |
在派生类外 |
在下一层公用派生类中 |
公用 |
可以 |
可以 |
可以 |
保护 |
可以 |
不可以 |
可以 |
私有 |
可以 |
不可以 |
不可以 |
不可访问 |
不可访问 |
不可访问 |
不可访问 |
6、 派生类的构造函数
用户在声明类时可以不定义构造函数,系统会自动设置一个默认的构造函数,在定义类对象时会自动的调用这个默认的构造函数,构造函数的主要作用就是对数据成员初始化。
(1) 简单派生类的构造函数
派生类构造函数名(总参数表):基类构造函数名(参数表)
{
派生类中新增数据成员初始化语句;
}
class student
{
public:
student(int m_Num,string m_Name,char m_Sex)//定义基类构造函数并赋值
{
m_Num=123;
m_Name="zhangsan";
m_Sex=f;
}
~student();//定义基类的析构函数
protected:
int m_Num;
string m_Name;
char m_Sex;
};
class stu:protected student
{
public:
stu(int m_Num,string m_Name,char m_Sex,int m_Age,string m_Addr):student(m_Num,m_Name,m_Sex)
//注意,student(m_Num,m_Name,m_Sex)是调用基类的构造函数,因此这些参数是实参
{
m_Age=24;
m_Addr="shandong";
}
~stu();
void get_value();
void display();
protected:
int m_Age;
string m_Addr;
};
//也可以在类外定义派生类的构造函数
class computer
{
public:
computer(int m_Size,string m_Brands);//声明构造函数
~computer();
};
computer::computer(int m_Size, string m_Brands)//在类外定义构造函数
{
m_Size=15;
m_Brands="LENOVO";
}
(2) 有子对象的派生类的构造函数
派生类构造函数名(总参数表):基类构造函数名(参数表),子对象名(参数表)
{
派生类中新增数据成员初始化语句;
}
执行派生类构造函数的顺序是:调用基类的构造函数,对基类数据成员初始化;调用子对象的构造函数,对子对象数据成员初始化;调用派生类的构造函数,对派生类数据成员初始化
(3) 特殊形式
A. 当不需要对派生类新增的成员进行任何初始操作时,派生类构造函数的函数体可以为空
B. 如果在基类中没有定义构造函数,或定义了没有参数的构造函数,在定义派生类构造函数时可以不写基类的构造函数。