*组合与继承
先说说组合,当设计一个新的类的时候,可以将一个已有类的对象作为成员,然后通过成员对象实现已有类的功能,类的对象成员与内置类型数据成员的声明语法一样。我们很早就开始接触并使用了。
再说说继承:
c++一共有着三大特性,封装继承和多态,所以足以体现出继承的重要。我感觉继承就是是为了实现代码的复用,如果派生类继承了基类那么就会继承基类所有的数据成员及成员函数,在公有继承的情况下,每个派生类的对象也是基类类对象。
继承又分为单继承、多继承等方式。但是正是因为继承太有用、太容易用、很容易实现代码的复用性因此我们需要选择性的继承。如果A类和B类毫无关系,我们不应该为了让B类多一个功能而去让B继承A。如果在逻辑上B是A的一种,打个比方说B类的man也是A类的 Hunman的一种我们就可以让B类去继承A类。
继承有公有继承public,私有继承private,以及保护继承protected三种(我也不知道是不是该读保护继承)在公有派生类中,基类的public成员和protected成员被继承,分别作为派生类的public 成员和protected 成员。基类的private成员虽然也被继承了,但在派生类中是不可见的。
在私有派生类中,基类的public成员和protected成员被派生类作为自己的private成员继承下来。基类的private 成员虽然也被继承了,但在派生类中是不可见的。
继承时也可以使用protected限定符,这时基类的public成员和protected成员都被派生类作为自己的protected成员继承下来。基类的private成员在protected派生类中仍是不可见的。
*c++多态性
一、什么是多态?
①通过继承同一个基类,产生了相关的不同的派生类,与基类中同名的成员函数在不同的派生类中会有不同的实现,也就是说:一个接口、多种方法。就像重载运算符,也是一种多态的提现吧。
②多态是c++面向对象的重要内容之一,它是一种行为的封装,是同一个事物所表现出来的多种形态,就是一个接口,多种形态。
多态分为两种:
一种是静态多态,是指编译时候的多态,通过函数重载或者运算符重载实现。
一种是动态多态,是指运行时候的多态,通过虚函数与基类指针共同作用实现。
二:如何实现多态?
在C++中,基类指针是用来指向基类对象的,如果用它来指向派生类对象,则进行指针类型转换,将派生类指针转换为基类指针,所以该指针将会指向派生类对象中的基类部分,通过该指针是无法调用派生类对象中的成员函数的。
但是,虚函数突破了这一限制。在派生类的基类部分中,派生类的虚函数取代了基类原来的同名虚函数,因此在使基类指针指向派生类对象后,使用该基类指针调用这个同名虚函数成员时就调用了派生类的虚函数。
当把基类的某个成员函数声明为虚函数时,C++允许在其派生类中对该虚函数进行重新定义,赋予它新的功能,并且可以通过基类指针指向同一类族的不同派生类的对象,来调用相应派生类中的该同名虚函数。
由虚函数实现的动态多态性就是:同一类族中不同的派生类对象,对同一函数调用作出不同的响应。
虚函数的使用方法如下:
在基类中使用virtual关键字声明成员函数为虚函数(这样就可以在派生类中对该虚函数进行重新定义,赋予它新的功能)。在派生类中重新定义此虚函数,要求函数名、形参列表、返回值类型均要与基类中的虚函数相同,并根据具体需要重新定义它的函数体。
C++规定,当一个成员函数被定义为虚函数后,其派生类中的同名函数都自动成为虚函数(而不一定要有关键字virtual显示声明了),如果要是为了清晰,可以在每一层都加上virtual关键字。
纯虚函数:有时,在定义一个虚函数时,并不定义其函数体,即它的函数体是空的,它的作用只是保留一个虚函数名,它关注的是接口的统一性,其具体的功能实现由它的派生类完成。