欢迎光临散文网 会员登陆 & 注册

计算机程序基础教程(13):C++ 继承与虚函数

2023-06-03 17:53 作者:阿狸喜羊羊  | 我要投稿


【继承】


继承可以让两个类共同使用一部分非私有成员,提供共用成员的类称为父类或基类,使用共用成员的类称为子类或派生类,子类创建对象时会包含继承自父类的成员。


 ● 继承方式


继承方式用于设置子类继承自父类成员的访问权限。

  1. public,子类继承的父类成员保持原有访问权限,最常用的是此方式。

  2. private,子类继承的父类成员全部改为私有权限。

  3. protected,子类继承的父类成员全部改为保护权限。



 ● 子类创建对象


子类创建对象时,会自动创建父类对象,并在子类构造函数中调用父类构造函数执行,若子类没有构造函数则编译器自动为其创建一个构造函数,作用是调用父类构造函数执行,若父类构造函数有参数,则应该在子类中自定义构造函数,并为父类构造函数参数赋值。

子类构造函数会首先调用父类构造函数执行,之后再返回执行子类构造函数代码,若两个构造函数功能有冲突,则以子类构造函数为准。

另外子类创建对象时不能直接赋值,这样容易与父类构造函数产生冲突。


子类对象使用完毕后,子类析构函数会调用父类析构函数执行,执行顺序为首先执行子类析构函数、之后执行父类析构函数,若子类没有析构函数则编译器自动创建一个析构函数,作用是调用父类析构函数执行。




 ● 对象类型转换


对象有类型之分,子类对象可以转换为父类类型,转换之后的子类对象只能调用继承自父类的成员,不能调用子类自定义成员,而父类类型不能转换为子类类型。

父类对象可以使用子类对象赋值,编译器自动将子类对象转换为父类类型。

子类对象不能使用父类对象赋值,父类中不包含子类自定义的成员。





【多继承】


继承关系可以一直传递下去,比如A派生B,B派生C,那C也会间接继承A,创建C对象时,会自动创建A、B对象,C调用B构造函数,B调用A构造函数。


除此之外,多继承还有另一种形式,一个类可以直接继承多个类,每个继承都可以单独设置继承方式,多个父类的构造函数都由子类构造函数负责调用。




 ● 菱形继承


菱形继承是一种复杂的多继承,继承关系图组成一个菱形,具体方式为:A派生出B和C,D又同时继承B和C,D创建对象时会自动创建B、C对象,B、C又会各自创建一个A对象,此时D对象就有两个可以使用的A对象,这将会导致混乱。


为了解决菱形继承的混乱,C++规定在菱形继承关系中,B和C继承A时添加virtual关键字设置为虚继承,此时创建D对象时只会创建一个A对象,并且三个父类对象的构造函数都将由D负责调用,而单独创建B或C对象时,与普通继承方式相同,没有区别。





【虚函数】


虚函数的作用是通过指针调用成员函数,虽然普通成员函数也可以使用指针调用,但是有一些限制,比如只能调用本类中的成员函数(包含继承自父类的函数),而使用虚函数可以通过指针调用子类的成员函数,从而扩大函数指针的使用范围,同源继承关系中所有类的虚函数都可以通过函数指针调用。


虚函数在父类中定义,子类继承虚函数后可以直接使用,也可以重写虚函数内部代码,重写虚函数类似在子类中定义同名函数,并且参数、返回值也相同。


编译器会将每个类的虚函数的地址放在一个数组中,称为虚函数地址表,函数指针使用此表进行赋值。



虚函数使用父类对象指针调用,编译器会转换为使用函数指针调用虚函数,对象指针赋值为哪个类对象的地址,就调用哪个类定义的虚函数(若子类没有重写虚函数,则调用父类虚函数),并且使用此对象指针为执行虚函数的this参数赋值。

虚函数也可以当做普通函数使用,直接通过函数名调用它,此时等于不使用虚函数机制,与使用普通函数无异。


父类中定义有虚函数时,必须定义一个虚析构函数,作用是调用使用new申请内存存储的子类对象析构函数执行,比如上面代码中父类对象指针这样赋值:base * a = new k;,子类对象使用完毕后执行delete a删除,指针a是父类类型,此时编译器默认只调用父类析构函数,不会调用子类析构函数,若将父类析构函数定义为虚析构函数,则会调用子类析构函数。



 ● 纯虚函数


使用虚函数机制时,需要创建父类对象指针,作用是通过函数指针调用子类虚函数执行,但是父类本身并不一定需要创建对象,若父类无需创建对象,只是提供父类对象指针,满足虚函数机制的使用方式,可以将父类中的虚函数定义为纯虚函数,包含纯虚函数的类称为抽象类。


纯虚函数与虚函数的主要区别如下:

  1. 包含纯虚函数的抽象类不能创建对象。

  2. 纯虚函数没有内容,子类必须重写纯虚函数,否则子类也是抽象类。




计算机程序基础教程(13):C++ 继承与虚函数的评论 (共 条)

分享到微博请遵守国家法律