阿狸先森|一文让你学完C++,干货收藏( 九 )

<< "Parent class area :" <area();// 存储三角形的地址shape =// 调用三角形的求面积函数 areashape->area();return 0;}当上面的代码被编译和执行时 , 它会产生下列结果:
Parent class areaParent class area导致错误输出的原因是 , 调用函数 area() 被编译器设置为基类中的版本 , 这就是所谓的静态多态 , 或静态链接 - 函数调用在程序执行前就准备好了 。 有时候这也被称为早绑定 , 因为 area() 函数在程序编译期间就已经设置好了 。
但现在 , 让我们对程序稍作修改 , 在 Shape 类中 , area() 的声明前放置关键字 virtual , 如下所示:
class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}virtual int area(){cout << "Parent class area :" <修改后 , 当编译和执行前面的实例代码时 , 它会产生以下结果:
Rectangle class areaTriangle class area此时 , 编译器看的是指针的内容 , 而不是它的类型 。 因此 , 由于 tri 和 rec 类的对象的地址存储在 *shape 中 , 所以会调用各自的 area() 函数 。
正如大家所看到的 , 每个子类都有一个函数 area() 的独立实现 。 这就是多态的一般使用方式 。 有了多态 , 就可以有多个不同的类 , 都带有同一个名称但具有不同实现的函数 , 函数的参数甚至可以是相同的 。
虚函数虚函数 是在基类中使用关键字 virtual 声明的函数 。 在派生类中重新定义基类中定义的虚函数时 , 会告诉编译器不要静态链接到该函数 。
我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数 , 这种操作被称为动态链接 , 或后期绑定 。
纯虚函数大家可能想要在基类中定义虚函数 , 以便在派生类中重新定义该函数更好地适用于对象 , 但是大家在基类中又不能对虚函数给出有意义的实现 , 这个时候就会用到纯虚函数 。
我们可以把基类中的虚函数 area() 改写如下:
class Shape {protected:int width, height;public:Shape( int a=0, int b=0){width = a;height = b;}// pure virtual functionvirtual int area() = 0;};= 0 告诉编译器 , 函数没有主体 , 上面的虚函数是纯虚函数 。
C++ 数据抽象数据抽象是指 , 只向外界提供关键信息 , 并隐藏其后台的实现细节 , 即只表现必要的信息而不呈现细节 。
数据抽象是一种依赖于接口和实现分离的编程(设计)技术 。
让我们举一个现实生活中的真实例子 , 比如一台电视机 , 可以打开和关闭、切换频道、调整音量、添加外部组件(如喇叭、录像机、DVD 播放器) , 但是我们不知道它的内部实现细节 , 也就是说 , 我们并不知道它是如何通过缆线接收信号 , 如何转换信号 , 并最终显示在屏幕上 。
因此 , 我们可以说电视把它的内部实现和外部接口分离开了 , 我们无需知道它的内部实现原理 , 直接通过它的外部接口(比如电源按钮、遥控器、声量控制器)就可以操控电视 。
现在 , 让我们言归正传 , 就 C++ 编程而言 , C++ 类为数据抽象提供了可能 。 它们向外界提供了大量用于操作对象数据的公共方法 , 也就是说 , 外界实际上并不清楚类的内部实现 。


推荐阅读