您的位置:首页 > 编程语言 > C语言/C++

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

2017-08-07 22:08 176 查看
第十三章 面向对象编程:多态性

使用
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
析构函数,即使它们的名称和基类函数不同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++