笔记11 《C++ 大学教程》

来源:互联网 发布:nginx转发配置 编辑:程序博客网 时间:2024/06/06 00:02

第十三章 面向对象编程:多态性

使用virtual函数和多态性,可以设计和实现更具扩展性的系统。程序员编写的程序可以处理在开发阶段不存在的对象类型

使用virtual函数的多态性程序设计无需使用switch逻辑。 可以利用virtual函数自动完成等价的逻辑

必要时,派生类会提供基类virtual函数自己的实现,否则就是用基类的实现。如果通过按引用和使用圆点成员选择符来调用virtual函数,则该函数调用是在编译时确定的(这称为静态绑定),被调用的virtual函数视为该特定对象定义的函数

抽象类只能做基类,称为抽象基类,不能实例化任何对象。如果类可以实例化对象,那么该类就称为具体类

把类的一个或多个virtual声明为纯virtual函数,该类就称为抽象类。纯virtual函数是在它的声明中带有纯指示符(=0)的函数

如果一个类从一个带有纯virtual函数的类派生,并且该类没有为该纯virtual类提供定义,那么在此类中的纯virtual函数依旧是纯virtual函数,相应的,该派生类也是一个抽象类

C++支持多态性,所谓多态性是由于继承而关联在一起的不同类对象,对于相同的成员函数调用做出不同的反应

多态性通过virtual函数和动态绑定实现的。当通过基类指针或引用请求使用一个virtual函数时,C++在与对象相关的合适的派生类中选择正确的重载函数

通过virtual函数和多态性的使用,一个成员函数调用根据接受该调用对象的类型不同做出不同的反应

尽管不能实例化抽象基类的对象,当可以声明指向抽象基类对象的指针和引用。这样的指着和引用可以用来对实例化的具体派生类的对象进行多态操作。

动态绑定需要在运行时把virtual成员函数调用传送到恰当类的virtual函数的版本。virtual函数表简称vtable,他是一个包含函数指针的数组。每个含有virtual函数的类都有vtable。对于类中的每个virtual函数,在vtable中都有一个包含函数指针的项,此函数指针指向该类对象的virtual函数版本。

当基类提供一个virtual成员函数时,派生类可以重载此virtual函数,但并不是必须。

当由指向派生类对象的基类指针进行一次函数调用时,vtable中相应的函数指针可以在执行期间获得,然后间接引用该指针,从而完成这此函数调用。vtable的检索和指针的间接引用只占用很少的运行时间。

任何类只要它的vtable中含有一个或多个0指针,就是一个抽象类,否则就是具体类

dynamic_cast运算符检查指针所指向对象的类型,然后判断这一类型是否与此指针正在转换成的类型有一种“是一个”的关系。如果是,返回对象的地址,否则返回0

运算符typeid返回包含操作数数据类型信息的type_info类对象的一个引用,信息中包含数据类型的名称。该运算符包含着头文件<tyoeinfo>中.type_info 的成员函数name返回一个基于指针的字符串,包含type_info对象所表示的类型名

如果一个类包含virtual函数,就要把基类的析构函数声明为virtual析构函数,这会使所有派生类的析构函数自动声明为virtual析构函数,即使它们的名称和基类函数不同。