C++面向对象程序设计 继承与多态知识总结

一、继承

继承的定义

继承是面向对象的核心特征之一,也是一种复用已有类的机制。在已有类的的基础上继承得到新类型,这个类型自动拥有已有类的特征,并可以修改继承得到的特性或者增加自己的新特性。在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++面向程序设计的重要部分,所以在以后还是要多看课本,多加练习。

 

 

 

 

 

                 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值