1 虚拟的输入输出
1. 第一次引入虚拟函数的基类,必须在类声明中指定virtual关键字。如果定义被放在类的外面则不用再次指定关键字virtual。
2. 引入虚拟函数的类必须定义它,或者把它声明为纯虚拟函数。
3. 为了使虚拟函数的派生类实例能够改写其基类的活动实例,它的原型必须与基类完全匹配。包括参数、返回值、const性等等。
a) 但派生类实例的返回值,可以是基类实例返回类型的公有派生类类型。
2 纯虚拟函数
C++语言为提供了一种语法结,构通过它可以指明一个虚拟函数,只是提供了一个可被子类型改写的接口,但是它本身并不能通过虚拟机制被调用,这就是纯虚拟函数。纯虚拟函数的声明如下所示:
virtual 返回值 FunctionNmae(参数) = 0;
包含或继承一个或多个纯虚拟函数的类被编译器识别为抽象基类,试图创建一个抽象基类的独立类对象会导致编译时刻错误。
抽象基类只能作为子对象出现在后续的派生类中,不能声明抽象基类的对象,但是可以声明抽象类的指针。
3 虚拟函数的静态调用
当用类域操作符调用虚拟函数时,我们改变了虚拟机制,使得虚拟函数在编译时刻被静态解析。改变虚拟机制常常是为了效率,在一个派生类虚拟函数中,有时需要调用基类的实例来完成”已经在基类和派生类实例之间被抽取出来“的操作。
纯虚拟函数可以通过虚拟机制被调用,也可以被静态调用。
4 虚拟函数和缺省实参
如果一个虚函数在基类提供了一个缺省的参数值,而在派生类中提供了另外一个缺省的参数值,这时候的调用会出现问题,如果用的是基类的指针或者引用调用,则使用的是基类的缺省参数,否则才是派生类的缺省参数。这是因为缺省实参不是在运行时刻决定的,而是在编译时刻根据被调用函数的对象的类型决定的。
遇到这样的问题可以通过把缺省实参作为用户是够提供实参的标志,而在内部用局部变量作为真正的参数。
posted on 2009-03-27 10:37
chatler 阅读(203)
评论(0) 编辑 收藏 引用 所属分类:
C++_BASIS