15.12 运算符重载
就像对成员函数那样,我们可以使用virtual运算符。然而,因为我们可能对两个不知道类型的对象进行操作,所以实现virtual运算符通常会很复杂。这通常用于处理数学部分(对于它们,我们常常重载运算符)。例如,对于一个处理矩阵、向量和标量的系统,这3个成分都是派生自Math类。
为了简单起见,这里仅重载了operator*。重载的目的是使任意两个Math对象相乘并且生成所需的结果—注意矩阵乘以向量和向量乘以矩阵是两个完全不同的操作。
main()中的问题在于,表达式m1*m2包含了两个向上类型转换的Math引用,因此不知道这两个对象的类型。一个虚函数仅能进行单一指派—即判定一个未知对象的类型。本例中所使用的判定两个对象类型的技术称之为多重指派(multiple dispatching),一个单一虚函数调用引起了第二个虚函数调用。在完成第二个调用时,已经得到了这两个对象的类型,于是可以执行正确的操作。我们开始时会有点不清楚,但如果多看些例子,就会理解的。这个主题在本书的第2卷(可从www.BruceEckel.com处下载)的“设计风格”一章中有更深入的探讨。