C++开发中级


795 浏览 5 years, 4 months

4.5 利用多态性

版权声明: 转载请注明出处 http://www.codingsoho.com/

利用多态性

现在SpreadsheetCell层次结构具有多态性,客户代码可以利用多态性提供的种种好处。下面的测试程序展示了这些功能:

为了演本多态性,测试程序声明了一个具有3个SpreadsheetCell指针的数组,记住由于SpreadsheetCell是一个抽象类,因此不能创建这种类型的对象。然而,仍然可以使用SpreadsheetCell的指针或者引用,因为实际上指向的是子类对象。这个数组由于是父类型SpreadsheeCell的数组,因此可以任意存储两个子类。这意味着数组元素可以是StringSpreadsheetCell也可以是DoubleSpreadsheelCell。

SpreadsheetCell* cellArray[3];

数组的第0个元素指向新建的StringSpreadsheetCell,第1个元素也是指向一个新建的StringSpreadsheetCell,第2个元素指向一个新建的DoubleSpreadsheetCell。

cellArray[0] = new StringSpreadsheetCell();
cellArray[1] = new StringSpreadsheetCell();
cellArray[2] = new DoubleSpreadsheetCell();

现在数组包含了多类型数据,并且基类声明的任何方法都可以应用到数组中的对象。代码只是使用了SpreadsheetCell指针一一编译器在编译时不知道对象实际类型是什么。然而,由于这两个类是SpreadsheetCell的子类,因此必须支持SpreadsheetCell的方法。

cellArray[0]->set("hello");
cellArray[1]->set("10");
cellArray[2]->set("18");

当调用getString()方法时,每个对象都会正确地返回值的字符串表示。重要的(某种意义上是令人惊讶的)是,不同的对象以不同的方式完成这一任务。StringSpreadsheetCell返回它存储的值,DoubIeSpreadsheetCell首先执行转换。作为程序员,您不需要知道对象如何做到这一点—您只需要知道因为对象是一个SpreadsheetCell,因此可以执行此行为。

cout << "Array values are [" << cellArray[0]->getString() << "," << 
                                              << cellArray[1]->getString() << "," << 
                                              << cellArray[2]->getString() << "," << 
                                               endl;
return 0;