联编和多态二(纯虚函数,抽象类,final)

目录

纯虚

一:纯虚函数

二:纯虚函数的语法

三:纯虚函数的意义

四:抽象类:

五:final关键字


纯虚

一:纯虚函数


1、纯虚函数是一种特殊的虚函数
2、在基类中不给虚函数有意义的实现

3、把它的实现留给派生类去实现
4、析构函数也可以是纯虚函数,但是需要在类外实现
我们知道虚函数是会继承到派生类中去的,那么既然在父类里面没有实现,那么在子类中可不可以实现呢, 当然是可以,所有的函数都可以做成纯虚函数,除了构造函数,构造一般不会写虚的,虚构函数也可以是纯虚函数,类外还是要实现函数体的,

二:纯虚函数的语法
 


virtual 返回值类型 函数名(参数表) = 0;
像我们平时写函数,要么定义,要么声明,那么后面的零是怎么回事呢,其实这就是所谓的没有意义的实现。

举个例子

#include<iostream>
using namespace std;
class Father
{
public:
    virtual void test_Func()=0;//virtual void test_Func()这样是没有实现virtual void 
    //test_Func(){};这样是有意义的实现。
    vitual ~Father()=0;//这就是所谓的纯虚函数无意义的实现
};
Father::~Father()
{
    cout << "Father::~Father()" << endl;
}
class Son:public Father
{
public:
    virtual void test_Func();
    ~Son();
};
void Son::test_Func()
{
    cout << "Son::test_Func()" << endl;//这就是在父类中进行的纯虚函数在父类中没有意义的
    //实现,然后在子类中有意义的实现了
}


父类和子类公有的函数是test_Func(); ,但是如果把virtual去掉的话,就不太可以了,那么就会出现父类函数和子类函数重名的现象,这个东西如果重名了,那么父类的函数是会被隐藏的,那么访问的时候,就要通过类名去访问了的,如果没有加virtual的话,就是同名的两个不同函数,但是在这里加virtual了,就不算是重名了,实际上是属于重写,所谓重写就是没有创造一个新的函数,只是把父类的函数重新实现了一下,给了新的函数体,这就是重写,重名是出现新的函数,名字相同而已,而重写是没有出现新的函数,是把之前的函数改造一番,重新实现一下函数体,一定要注意这些细节

三:纯虚函数的意义


为什么要有纯虚函数呢
实际上是因为,有些情况下,需要一个父类去派生出不同的子类,这些子类的行为,虽然都差不多
,但是还是有区别,所以不能在父类里面给这些行为一个规范,举个例子,游戏里面,有不同的怪物。小,中,大,虽然说这些怪物都可以打人,但是对你的伤害是不一样的,那么既然对你造成的伤害,不一样,那我肯定不能用一样的函数去伤害不同的怪物,那么我们一般情况下,用多态怎么去实现呢,就是先写一个父类,父类就是敌人类,它是具有攻击你的一个方法的,但是先在不好去实现这个函数体,因为,我有不同的敌人,所以从敌人类,派生出不同的子类,也就是不同的怪物,每个子类对应了某一类具体的敌人,比如说小怪物,一下让你掉十滴血,大的,一下让你掉20滴,那么不同的子类行为很相似,都是攻击你,但是数据不一样。所以就可以写一个父类,然后派生出不同的子类,这些子类行为类似,但是不一样,这下就不能在父类中单独的去实现某一个行为了,那么就不需要给一个具体的函数体了,因为只要知道函数就可以了,具体的函数交给你们子类去实现,那么我就写成纯虚函数就行了。
纯虚函数还有一个好处,就是一个类里面写了纯虚函数了,只要纯虚函数没有有意义的实现,那么
这个类就不可以去创建对象。

纯虚函数可以套娃,如果在子类中还没有对纯虚函数进行有意义的实现的话,子类的子类同样可以
继承过去实现。这样是没有问题的。

四:抽象类:


当然是一个类里面有纯虚函数的时候才有可能出现抽象类这个概念。
1、在类中有纯虚函数,类被称为抽象类(为什么说是抽象类呢,因为它不具体啊,因为有一个成员函数没有有意义的函数体,那么当然就不具体了,我们又不能把它叫做不具体类,所以就叫抽象类,只要这个类中有纯虚函数,那么它就可以被称为是抽象类,如果这个类里面都是纯虚函数的话,那它还是叫做抽象类嘛,也没有规定纯虚函数的数量,只要有纯虚函数,就叫做抽象类,但是如果全是纯虚函数的话,就可以称为纯虚类,这样是没有问题的。
2、不能实例化对象,可以定义指针作为基类为派生类服务(抽象类是不能实例化对象的,但是还是有自己的功能的,可以去定义指针,因为类类型还是存在的,只是不能实例化对象而已,这个指针可以作为基类指针,指向子类对象去掉函数,那为什么要这样呢,我用子类指针去指向子类对象的话,它不好嘛,不好,因为一个类不仅仅跟自己有关系,还要跟其他类有交流,比如说用一个带有纯虚函数的抽象类,去派生出不同的子类,如果说跟英雄打起来的话,那么就一定有个中间人)
3、派生类中没有完全实现基类中所有的纯虚函数,那么该派生类也会变成抽象类(一个类是可以被继承的,被继承之后,如果子类只实现了纯虚函数的一部分,这个时候,派生类也是抽象类了,因为只要有没实现的纯虚函数,就是抽象类,当然同样也具有抽象类的特点,不能实例化对象,因为函数没有有意义的实现,那么对象调用该函数,这个函数没有实现,不知道是干嘛的,那么这时候编译器可不背锅,就会出现问题)

五:final关键字


这个东西就像一个终结者,怎么终结的呢,这个知识点主要还是用于虚函数继承里面
1、父类的虚函数或者纯虚函数在子类中依然是虚函数
2、关键字final可以让父类虚函数不能再次被重写
3、关键字final可以让一个类不能被继承(从此以后这个类就没有儿子了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翘指

创作不易,一分也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值