虚函数与多态性

来源:互联网 发布:怎么在u盘中装ubuntu 编辑:程序博客网 时间:2024/05/22 14:28

        冠以关键字virtual的成员函数称为虚函数。只有使用同一个基类指针访问虚函数,才称为运行时的多态。基类指针不需经过类型转换就可以指向派生类对象,但只能访问派生类从基类继承的成员。虚函数调用的解释依赖于调用它的对象类型,使基类指针指向不同派生类的对象时自动完成this指针类型转换,以访问虚函数在派生类的不同实现版本。

        重载一个虚函数时,要求函数名、返回类型、参数个数、参数类型和顺序完全相同,若函数原型不同,仅函数名相同,则C++认为是一般函数重载,从而丢失虚特性。虚函数是仅由this指针区分接口的函数,C++的“虚”特性仅负责在程序运行时把基类this指针的关联类型转换成当前指向对象的类类型,而不能改变函数其它参数的性质。(Hunger:在派生类中声明虚函数时,不需要冠以virtual关键字。)

        构造函数不能是虚函数。因为建立一个派生类对象时,必须从类层次的根开始,沿着继承路径逐个调用基类的构造函数,直至自身的构造函数,不能“选择性地”调用构造函数。所以虚构造函数没有意义,定义虚构造函数将产生语法错误。析构函数可以是虚的。虚析构函数用于动态建立类对象时,指引delete运算符选择正确的析构调用。每个基类的析构函数都应该声明为虚函数

        纯虚函数是在基类中说明的虚函数,它在该基类中没有实现定义(函数赋值为0),要求所有派生类必须定义自己的版本。一个具有纯虚函数的基类称为抽象类,抽象类至少有一个纯虚函数。一个抽象类的派生类如果没有为继承的纯虚函数定义实现版本,则仍然是抽象类。对应地,定义了纯虚函数实现版本的派生类称为具体concrete

        虚函数和多态性能够使成员函数根据调用对象的类型产生不同的动作(当然需要一定的时间开销),这给程序设计赋予很大的灵活性。多态性特别适用于实现分层结构的软件系统,便于对问题抽象时定义共性实现时定义区别



C++ 虚函数表解析

0 0