泛型程序设计
当一个程序需要一个基类对象时,可以提供一个派生类的对象。我们称之为泛型程序设计。这种设计使得一个函数能适应更大的范围的对象实参,变得更加通用。
用我们前面说到的例子来讲,假如有一个函数displayGeometricObject()可以传入GeometricObject类的对象:
void displayGeometricObject(const GeometricObject& g) { //在控制台打印对象g的描述信息 cout << g.toString() << endl; }
我们声明三个对象:
GeometricObject g;
Circle c;
Rectangle r;
那么这个三个类都可以当做displayGeometricObject函数的参数传入:
displayGeometricObject(g);
displayGeometricObject(c);
displayGeometricObject(r);
其实这很容易理解:我说我想要一个几何图形,但是没有具体的说是什么图形。那么你可以给我一个圆,也可以给我一个矩形,但是你不能够给我一个苹果,因为它不是几何图形。而且你也不能给我一个几何图形,因为几何图形是抽象的,你没有办法拿出来。水果也是抽象的,你只能拿出苹果、香蕉、梨等具体的水果,但是没有办法直接拿出一个水果。
我们运行上面的程序会发现最终的结果是:
(GeometricObject类的toString方法返回字符串"Geometry Object")
(Circle类的toString方法返回字符串"Circle Object")
(Rectangle类的toString方法返回字符串"Rectangle Object")
(前面打印了三句“我是一个几何图形”是因为GeometricObject类的构造函数中有"cout << "我是一个几何图形" << endl;"语句,每次子类或父类创建对象时候都要调用)
最终显示出三行"Geometry Object",而不是我们预期的:
Geometry Object
Circle Object
Rectangle Object
这是因为它直接调用了GeometryObject类的toString函数。
如果想要得到我们预期的结果,就涉及到了虚函数的概念,会在下一篇讲到(C++虚函数)。
多态
多态就是多种形态的意思。
多态意味着一个父类型的变量可以引用一个子类型的变量。
displayGeometricObject(const GeometricObject g)函数能够传入不同类型的参数就是多态的体现。