当前位置: 首页 > 文档资料 > C++大学教程 >

10.11 章节小结

优质
小牛编辑
121浏览
2023-12-01

虚函数和多态性使得设计和实现易于扩展的系统成为可能。在程序开发过程中,不论类是否已经建立,程序员都可以利用虚函数和多态性编写处理这些类对象的程序。

虚函数和多态性的程序设计无需使用 switch 逻辑。程序员可以用虚函数机制自动完成等价的逻辑,因而避免与swilch逻辑有关的各种各样的错误。如果要让客户代码确定对象类型和表达,则是低质的类设计。

派生类在需要的时候可以自己提供基类的虚函数实现,否则就使用基类的实现。

如果通过用名字和圆点成员选择运算符引用一个特定的对象来调用虚函数,则引用是在编译时确定的(称为静态关联).被调用的虚函数是为该特定对象的类定义的函数或继承该类的函数。

在许多情况下,定义不实例化为任何对象的类很有用处,这种类称为“抽象类”。因为抽象类要作为基类被其他类继承,所以通常也把它称为“抽象基类”。抽象基类不能用来建立实例化的对象。

可以建立实例化对象的类称为具体类。

将带有虚函数的类中的一个或者多个虚函数声明为纯虚函数,则该类就成为抽象类。纯虚函数是在声明时“初始化值”为。的函数。

如果某个类是从一个带有纯虚函数的类派生出来,并且没有在该派生类中提供该纯虚函数的定义,则该虚函数在派生类中仍然是纯虚函数,因而该派生类也是一个抽象类(不能有任何对象)。

C++支持多态性。所谓多态性是指:通过继承而相关的不同的类,他们的对象能够对同一个函数调用做出不同的响应。

多态性是通过虚函数实现的。

当通过基类指针或引用请求使用虚函数时,c++会在与对象关联的派生类中正确的选择重定义的函数。

使用虚函数和多态性能够使成员函数的调用根据接收到该调用的对象的类型产生不同的动作。

尽管不能实例化抽象基类的对象,但是可以声明抽象基类的指针。当实例化了具体类的对象后,可以用这种指针使派生类对象具有多态操作能力。

使用动态关联(也叫滞后关联)可以向系统中添加新类。对于要被编译的虚函数调用,编译时可以不必知道对象的类型。在运行时,虚函数调用和被调用对象的成员函数相匹配。

动态关联可以使独立软件供应商(ISV)在不透露其秘密的情况下发行软件。发行的软件可以只包括头文件和对象文件,不必透露源代码。软件开发者可以利用继承机制从ISV提供的类中派生出新类。和ISV提供的类一起运行的软件也能够和派生类一起运行,并且能够使用 (通过动态关联)这些派生类中重定义的虚函数。

动态关联要求在运行时把对虚函数的调用转换为对应类的虚函数版本。虚函数表(称为vtable)实现为包含函数指针的数组,每一个包含虚函数的类都有一个vtable。对于类中的每一个虚函数,viable都有一个包含一个函数指针的项目,该指针指向类的对象所要使用的虚函数版本。特定类所要使用的虚函数可能是该类中重新定义的函数,也可能是从较高层的基类直接或间接继承来的函数。

当基类提供了一个成员函数并将它声明为virtual时,泥生类可以但不是必须重定义该虚函数,因此派生类可以使用基类的虚函数版本,这会在vtable中指明。

带有虚函数的类的每一个对象都包含一个指向该类viable的指针。系统在运行时会获取并复引用正确的函数指针来完成函数调用,查找vtable和复引用指针只需要极少的运行时间的开销,一般少于最优的客户代码。

如果基类中包含虚函数,把其析构函数声明为虚析构函数。这样做将会使所有派生类的析构函数自动成为虚析构函数(即使它们与基类析构函数的函数名不同)。这时,如果delete运算符用于指向派生类对象的基类指针,而程序中又显式地用该运算符删除每一个对象,那么系统会调用相应类的析构函数。

任何类在vtable中有一个或几个0指针时就成为抽象类。而没有0指针时就成为具体类(如 Point、Circle 和 Cylinder)。