免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1262 | 回复: 0
打印 上一主题 下一主题

虚拟函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-01 13:27 |只看该作者 |倒序浏览
在派生类中重新定义基类的方法;

使用虚拟方法(virtual):如果没有使用关键字virtual ,程序将根据引用类型或指针类型选择方法;如果使用了,程序将根据引用或指针指向的对象的类型来选择方法。例如:

Brass dom("dominic banker", 1122,4235.5);

BrassPlus dot("dorothy", 1231,2231.;

Brass & b1_ref = dom;

Brass & b2_ref = dot;

                                          如果没有关键字virtual                      如果使用关键字virtual

b1_ref.ViewAcct();    使用Brass::ViewAcct()                              使用Brass::ViewAcct()

b2_ref.ViewAcct();    使用Brass::ViewAcct()                              使用BrassPlus::ViewAcct()

也就是说,使用virtual的,主要看引用是引用的什么对象,而不用关键字的,是看引用本身是什么对象。

记住:要在派生类中重新定义基类的方法,通常应将基类方法声明为虚拟的。virtual只用于类声明的方法原型中。

使用虚拟虚构函数可以确保正确的析构函数序列被调用。





1 在基类方法的声明中使用关键字virtual可使该方法在基类以及所有的派生类(包括从派生类生出来的类)中是虚拟的;

2 若使用指向对象的引用或指针来调用虚拟方法,程序将使用为对象类型定义的方法,而不是用为引用或指针类型定义的方法。这称为动态联编或晚期联编。

3 若定义的类被用作基类,则应该将那些要在派生类中重新定义的类方法声明为虚拟的。

4 构造函数不能是虚拟函数。派生类不能继承基类的构造函数。

5 析构函数应当是虚拟函数,除非类不用做基类。

6 友元不能是虚拟函数,因为友元不是类成员,而只有成员才能是虚拟函数。



如果基类方法没有关键字virtual ,而派生类也没有重新定义此方法,那么派生类对象调用此方法。

如果基类方法使用关键字virtual ,而派生类重新定义此方法,但是没有用virtual ,派生类中将隐藏基类的方法。

如果基类方法使用关键字virtual ,而派生类用virtual 重新定义此方法,那么有派生类再派生出来的类可以重新定义此方法。

如果基类声明被重载了,则应在派生类中重新定义所有的基类版本。如果只重新定义一个,那么其他版本将被隐藏,在派生类中无法使用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP