一、继承
继承的定义
继承是面向对象的核心特征之一,也是一种复用已有类的机制。在已有类的的基础上继承得到新类型,这个类型自动拥有已有类的特征,并可以修改继承得到的特性或者增加自己的新特性。在C++中,被继承的以有类称为基类,继承得到的新类成为派生类。派生类可以在被继承,这样构成的层次结构称为继承层次。
继承的语法结构
class 派生类名名字:[访问限定符]基类名字
{
成员声明;
};
举例
//这是一个简单的学生类
class student{
string name;
int student_id;
string department;
public:
student(string nm,int id,string dp);
void printf()const;
};
//这是一个研究生类,因为研究生要处理更多的信息,所以数据比student类里的数据要多
class grad_student{
string name;
int student_id;
string department;
string thesis;
public:
grad_student(string nm,int id,string dp,string th);
void printf()const;
};
//因为在grad_student类中包含了student类的所有成员,所以利用继承
class grad_student:public student //grad_student继承student类
{
stirng thesis;//其他成员从student继承得到,不用再重复声明
public:
grad_student(string nm,int id,string dp,string th);
void printf()const;
};
在这个例子中grad_student继承了student类,也就是说student类是基类,grad_student类是派生类。
派生类成员的访问控制
访问控制共有三种
public:公有继承
private:私有继承
protected:保护继承
注意一点:无论以何种方式继承基类,派生类都不能使用基类里面的私有成员。
公有继承、私有继承和保护继承的区别
public继承方式
基类中所有public成员在派生类中为public属性;
基类中所有protected成员在派生类中为protected属性;
基类中所有private成员在派生类中不可访问。
protected继承方式
基类中的所有public成员在派生类中为protected属性;
基类中的所有protected成员在派生类中为protected属性;
基类中的所有private成员在派生类中仍然不可访问。
private继承方式
基类中的所有public成员在派生类中均为private属性;
基类中的所有protected成员在派生类中均为private属性;
基类中的所有private成员在派生类中均不可访问。
基类中的成员 | 在公用派生类中的访问属性 | 在私有派生类中的访问属性 | 在保护派生类中的访问属性 |
---|---|---|---|
私有成员 | 不可访问 | 不可访问 | 不可访问 |
公用成员 | 公用 | 私有 | 保护 |
保护成员 | 保护 | 私有 | 保护 |
派生类和基类的不同
在派生类中修改基类的方式有如下两种
1、覆盖或隐藏基类的操作:重新定义基类接口中已经存在的操作,从而改变继承到的行为,使得派生类对象在接受到同样的消息时其行为不同于基类对象。
2、扩充接口:向派生类的接口中添加新操作,是的派生类的对象能够接受更多的消息。
二、虚函数与多态性
在C++语言中,基类将两种成员函数区分开来:一种是基类希望派生类覆盖的函数,另一种是基类希望派生类直接继承而不要改变的函数。对于前者将其定义为虚函数。
注意一点:析构函数可以是虚函数,构造函数不可以是虚函数。
声明虚函数语法形式:
virtual 返回类型 成员函数表(参数表)
虚函数在基类中用virtual关键字声明,virtual只能在类内的成员函数声明之前,不能用于类外的函数定义。
举例:
class employee{
public:
virtual void salary(){} //基类中声明的虚函数
};
//下面的派生类中的salary()都是虚函数
class manager:public employee{
public:
void salary(){/*经理工资的计算和发放*/}
//
};
class programmer:public employee{
public:
void salary(){/*程序员工资的计算与发放*/}
//
};
class parttime:public employee{
public:
void salary(){/*兼职人员工资的计算与发放*/}
//
};
//payroll()函数
void payroll(employee& re){
re.salary(); //通过基类引用调用虚函数,动态绑定
}
int mian()
manager Albus;
payroll(Albus); //根据实际类型调用manager::salary()
programmer Ron;
payroll(Ron); //根据实际类型调用programmer::salary()
此例中,基类中的salary声明为虚函数。同样是通过基类引用发送相同的salary()消息,却产生了不同的效果,即多态性。多态性可以为程序带来更大的灵活性和可扩展性。
自己的体会:
自己在学习这两章内容时,真心觉得很难,课本内容非常的多,而且抽象且不好理解。经过一段时间的练习,现在自己多这两部分有了一个新的认识。继承和多态时C++面向程序设计的重要部分,所以在以后还是要多看课本,多加练习。