纯虚函数与抽象类如何运用详解
定义成抽象类接口后优点:
1.代码具有非常好的扩展性,如果再加个hexagon类也很好处理,实现BaseGraphics定义的各个接口就好了
2.有助于多人协同开发,开发接口的不同关心如何实现接口,实现接口不用想太多,按要求一个个实现就好。
3.好的维护性,比如要修改Circle类里实现,只要改Circle部份,不用动到 其它代码。
面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
定义成抽象类接口后优点:
1.代码具有非常好的扩展性,如果再加个hexagon类也很好处理,实现BaseGraphics定义的各个接口就好了
2.有助于多人协同开发,开发接口的不同关心如何实现接口,实现接口不用想太多,按要求一个个实现就好。
3.好的维护性,比如要修改Circle类里实现,只要改Circle部份,不用动到 其它代码。
虚函数主要作用就为了,通过基类指针访问派生类定义的函数。通过继承和虚函数实现面向对象的多态性。
向上转换:是派生类(子类)向基类(父类)转换。
向下转换:是基类(父类)向派生类(子类)转换。
在编程时会经常性的发生名字隐藏,比如类继承时发生名字隐藏。当基类中定义一个变量wheelNum,派生类也定义一个wheelNum变量,这时就发生了名字隐藏。下段代码来说明类继承时名字隐藏:
类构造就是开始使用时定义,类就开始构造;析构就是对象不在使用时调用。对象构造时调用构造函数,对象析构时调用析构函数。那派生类构造时基类构造吗?顺序是怎样?派生类析构时基类析构吗?顺序是怎样?带这这两个问题写段代码来说明下。
面向对象语言都有类,也都有继承,继承可以很大程度上减少代码量,而让代码逻辑更清晰。继承可以使得子类(派生类)具有父类(基类)的属性和方法或者重新定义、追加属性和方法等。比如车是基类,娇车和公交车从车类派生而来,这就是一个继承的例子。
继承后派生类在内存如何存放基类成员:
C++11之前类成员初始化,都是通过构造函数,现在C++11可以直接在类成员定义时初始化,像java一样。接下来看一段代码来体会下类成员初始化。
类成员初始化代码例:
C++11新增类成员初始化方式:
C++11新增类成员初始化与构造函数:
组合类简单点讲就是A类中有B类,B类定义在A类外面。比如点类和圆类,圆类就可以设计成组合类。因为外部程序会用到点对象,也会用到圆对象,所以这种将圆类设计成组合类比嵌套类较合适。
嵌套类就是A类中有B类,B类定义在A类里面。这种就有了从属关系,要单独定义B类就必须要写成A::B b(B定义在A类中公有的public部份),这种可以看成多了一层名字空间,但这不是主要目的。一般来说B类如果只属于A类,外部几乎不会用到B类,这种情况下就会设计成设计成嵌套类。对类进行嵌套通常是为了帮助实现另一个类,并避免名称冲突。
类成员函数就是类中定义的函数。这样的函数都是成员函数,用以完成特定操作。类设计时成员函数的访问类型一般设为public公有的,这样就可以将成员变量都封装起来,更加安全。一般设计图:
注意一点定义成inline内联成员函数时,此函数体一定是比较小的,比如SetID(),GetID()两个成员函数,函数体只有一句语句。如果成员函数体比较大时,不要写成inline内联成员函数,这样是滥用影响性能。
成员函数重载方法可以参考函数重载,其实是一样的。只是它是类里面的函数,所以叫成员函数,也是函数所以跟函数重载一样。
访问控制符用于指定类中成员的可访问性。类中有3种访问控制符public/private/protected,3种访问控制符具体意义:
类成员访问控制符public/private/protected,具体如何使用,经验是一般对外的成员函数设计成public公有的,类如果要用于继承就将成员变量设计成protected保护的,类中如果确定不能直接被外部访问的变量就设计成private私有的。以上方法可供参考,具体如何设计访问控制符没有统一的标准,要根据实际情况来考虑。