C++语言的三大特点,继承、封装、多态。
继承说的就是子类能延续父类的行为(函数);封装为了能将父类的行为(函数)进行包装化供子类调用。那么多态呢,又是怎么回事呢?
多态,根据网上搜索的资料,都说是子类在继承父类的基础上,将父类的函数重写和修饰符重写。说简单点就有点像是,子类继承了父类的函数行为,将其多样化表现出来,不局限于一种方式。
举个例子,动物存在着睡眠状态、吃食物的动作,以及其他的动作,这里就表现出三种行为。再想到鱼时,是不是可以想象到它的这些动作。但是有没想过,难道所有的动物都有如此动作吗?是也不是!
为何这么说?
动物有以上三种行为,但是却不同于鱼的表现形式,可以想象下,狗的行为会和鱼的行为相同吗?当然不是。这里就涉及到多态的理念。
那么问题来了?在C++语言中,如何以多态形式表现出来呢?
Animal.h 作为父类
#ifndef _ANIMAL_H_ #define _ANIMAL_H_ class Aniaml { public: virtual void sleep() = 0; virtual void eat() = 0; virtual void run() = 0; }; #endif
在创建一个子类,Fish.h。
在这里,或许有人疑惑,明明是两个单独的类,怎么就说成是继承的关系?这里就引用到继承的写法:
这就是继承的写法,这里小编给大家一个坑,不管是不是坑,先运行下看看就知道了。我们再遇到问题时是有缘由地,先看看这些问题的样式,然后才好对症下药。
这里的问题大同小异,说明个问题,纯虚拟类在被继承后,子类出现了无法实例化(初始化)的问题。
请记住这种问题样式,然后再看看父类上有什么不一样的地方,是不是很奇怪,多了virtual关键字。这就是纯虚拟的意思,何意?
告诉编译器,此类是虚类。说到虚类学问多了,小编不多说,自己有兴趣可以动手查查他人的博客。
既然是虚类,那么子类在继承虚类的时候,就需要将虚类的函数全部重写(OverRide)。
有没有感觉到什么?父类的函数明明什么都没有,为什么需要重写,查过他人的博客你就会发现,这就是规则,编译器的编译规则。当然小编不是说规则的,而是多态。
父类的函数不管它有没有具体的代码,对于子类而言,既然是继承关系,子类就必须要重写这些函数,来达到子类该有的行为(函数)。这里的有个前提,就是父类是虚类,函数是虚函数。
这是多态的表现形式,说白了就是不同的子类在继承父类的同时,子类能用父类给的函数形成一套子类的不同表现形式,这就是多态。
或许还不能明白,举个例子说就是,狗的行为是贴地睡觉,吃骨头,奔跑,而鱼的行为就是睁眼睡觉,吃水草,游走。
都属于sleep()、eat()、run()函数中的一种表现形式,鱼和狗两种动物都继承了Animal(动物)这个类,将三种函数都能以不同的方式表现出来,这就是多态。
看下面代码:
Fish.h Fish.cpp
Dog.h Dog.cpp
重写后函数,它们的差别请看文字上,将父类的三种函数以不同形式表现出来,而不是局限于某种动作。个人估计,这是为了方便行事,不可能为了各种各样的函数都写一个,这样只会浪费时间,浪费精力。而出现了这种方式,给编译带来了便利。
然后我们在主体源文件上,敲上:
Fish fish;
fish.eat();
Dog dog;
dog.eat();
就可以打印出设计的效果。
在这里,写了一大堆的文字,就是告知:继承关系后多态的表现形式。没那么复杂,别看到三大特点几个字,就认为有多难以理解。事实上,多态想表达的意思就是这样的。
用到多态时,一定要记住,看清父类到底是不是虚类,如果确定是,你就把所有虚函数重写在子类当中,当然具体的实现方式,看后面小编如何操作。
浅显的认知,只需要知道这点就够了。
个人建议:多看看他人的博客,关于多态的理解,这里只是个人的见解,没有那么多专业词,只是为了用通俗的话便于理解。
下面小编再说说,类到底如何用?
我们在拿到一个项目都会头疼,明明懂了,但是一旦自己敲起来时就那么难呢?
在于一个问题,就是基础。还不够扎实,以后用到类是必不可少的!
每个项目可以说,都存在着,这就是小编下面要说的。
为了不让代码显得臃肿,让代码看起来更像那么回事,也更便于修改,修复,现在知道C++的实用之一了吧?
每一章内容,小编都会总结一些东西,当然这章也少不了。
学习任何东西,不能急于求成,这是一门学问,可以说是学到老也学不完的领域。学到哪算哪,够用就足够了!