VC/MFC
VB
Delphi
C++ Builder
C/C++
Java
.NET技术
MS-SQL Server
PowerBuilder
DB2
Oracle
Web 开发
Linux/Unix社区
硬件/嵌入开发
移动平台
您的位置:
程序门
->
c/c++
-> c++ 语言
关于virtual函数
[
收藏此页
] [
打印本页
]选择字色:
默认
灰色
红色
黄色
绿色
橙色
紫色
蓝色
褐色
墨绿
深蓝
赭石
粉绿
淡绿
黄灰
翠绿
综红
砖红
淡蓝
暗红
玫瑰红
紫红
桔黄
军黄
烟灰
深灰
灰蓝
背景色:
默认
黑色
红色
黄色
绿色
橙色
紫色
蓝色
褐色
墨绿
深蓝
赭石
粉绿
淡绿
黄灰
翠绿
综红
砖红
淡蓝
暗红
玫瑰红
紫红
桔黄
军黄
烟灰
深灰
灰蓝
字体:[
大
][
中
][
小
]
关于virtual函数
[已结贴,结贴人:jyq686]
发表于:
2007-02-09 10:48:42
楼主
昨天在网上看到一篇关于this指针的文章,结果不但没看懂,还暴露出我对虚函数的疑惑.如下:
#include <iostream>
using namespace std;
class cbase
{
public:
virtual void one()
{
cout < < "base class\n ";
}
cbase()
{
this -> one();
}
};
class cparent : public cbase
{
public:
cparent()
{
}
virtual void one()
{
cout < < "parent class\n ";
}
};
cparent example;
int main()
{
return 0;
}
结果输出是:base class
我的疑问是:程序执行cparent example;句时,先调用cbase类的构造函数cbase(),那末它就会执行this-> one()句,而因为cparent类中改写了函数函数one(),那么它必调用的是cparnet的虚函数one()吧?所以输出应该是:parent class啊。
/////////////////////////////////////////////////
下面我加一个函数abc来说明这一点啊。
#include "stdafx.h "
#include <vector>
#include <iostream>
using namespace std;
class cbase
{
public:
virtual void one()
{
cout < < "base class\n ";
}
cbase()
{
this-> one();
}
void abc()
{
cout < < "cbase abc " < <endl;
this-> one();
}
};
class cparent : public cbase
{
public:
cparent()
{
}
virtual void one()
{
cout < < "parent class\n ";
}
};
int main(int argc, char* argv[])
{
// printf( "hello world!\n ");
// cbase *example;
cparent parent ;
parent.abc();
return 0;
}
//输出结果:
base class
cbase abc
parent class
看,调用abc时输出的就是parnet class,为什么呢?
发表于:
2007-02-09 11:00:41
1
楼 得分:
0
当然是输出base class了,你注意this-> one().其实和不加this-> 一样,因为都是成员函数.这里的this对象肯定是base类型.
发表于:
2007-02-09 11:00:51
2
楼 得分:
0
以前也没注意这问题, 看上面的结果意思好象是 虚表是在构造函数只后才产生的..?
发表于:
2007-02-09 11:07:10
3
楼 得分:
1
楼上的说法似乎也有点道理.关于vtable什么时候创建的以前我还真没想过.应该是在构造函数调用之后.
发表于:
2007-02-09 11:10:07
4
楼 得分:
2
还有种解释,因为parent clas调用构造函数初始化之前先调用base class的构造函数,这时parent class的对象并没有生成,所以也不存在vtable之类的东西,当然这时只能调用base的one函数了.
发表于:
2007-02-09 11:16:02
5
楼 得分:
10
从对象的角度看:在base()调用时,基类对象部分构造完成,派生类对象部分尚未构建,此时的对象呈现基类特性。
从虚表的角度看:在base()调用时,对象的虚表被设为基类的虚表,所以会调用基类的函数;
在cparent()调用后,对象的虚表被reset为派生类的虚表,所以会调用派生类的函数。
发表于:
2007-02-09 11:20:18
6
楼 得分:
0
构造函数不能是虚的.
发表于:
2007-02-09 11:21:19
7
楼 得分:
0
基类是看不到父类的成员的
通过父类调用才能体现出多态
发表于:
2007-02-09 11:29:09
8
楼 得分:
0
johnny_de(是的,当时就是这样的!)
magicsutra()
两位说的好像都有道理,不过缺少论证。呵呵。
有没有这方面的文章啊。
发表于:
2007-02-09 11:33:05
9
楼 得分:
0
wanfustudio(雁南飞:知识之败,慕虚名而不务潜修也) ( ) 信誉:97 blog 2007-02-09 11:21:19 得分: 0
基类是看不到父类的成员的
通过父类调用才能体现出多态
----------------------------
cbase *example = new cparent;
example-> abc();
结果是一样的
发表于:
2007-02-09 12:21:11
10
楼 得分:
0
对象角度说法:看c++ primer; 虚表角度的说法:看inside c++ object.
发表于:
2007-02-09 12:37:19
11
楼 得分:
0
magicsutra()
从虚表的角度看:在base()调用时,对象的虚表被设为基类的虚表,所以会调用基类的函数;
在cparent()调用后,对象的虚表被reset为派生类的虚表,所以会调用派生类的函数。
#include "stdafx.h "
#include <vector>
#include <iostream>
using namespace std;
class cbase
{
public:
virtual void one()
{
cout < < "base class\n ";
}
cbase()
{
cout < <*(unsigned int *)this < <endl;//虚表地址
}
};
class cparent : public cbase
{
public:
cparent()
{
cout < <*(unsigned int *)this < <endl;//虚表地址
}
virtual void one()
{
cout < < "parent class\n ";
}
};
int main(int argc, char* argv[])
{
cparent parent ;
return 0;
}
发表于:
2007-02-09 15:47:18
12
楼 得分:
0
首先 base 的函数指针初始化为基类的, 因为基类是在子类完成之前就必须完成定义的,所以当时函数指针确实还是指向base::one(). 而当初始完基类后,子类相关的虚函数进行函数指针的改写.这时, 函数指针才指向parent::one();
因为调用的时机恰好在base 初始化之后, parent初始化之前,因此才出现这样的结果.
发表于:
2007-02-09 18:37:45
13
楼 得分:
7
c++ primer 3rd edition 17.5.8节
如果在基类的构造函数中调用了一个虚拟函数,而基类和派生类都定义了该函数的实例,
将会怎么样?应该调用哪一个函数实例?如果可以调用虚拟函数的派生类实例,并且它访问
任意的派生类成员,那么调用的结果在逻辑上是未定义的。而程序可能会崩溃。
为了防止这样的事情发生,在基类构造函数中调用的虚拟实例总是在基类中活动的虚拟
实例。实际上,在基类构造函数中,派生类对象只不过是一个基类类型的对象而已。
对于派生类对象,在基类析构函数中也是如此;派生类部分也是未定义的,但是这一
次不是因为它还没有被构造,而是因为它已经被销毁。
发表于:
2007-11-05 01:34:46
14
楼 得分:
0
学习标记.好问题!
下一篇:
person * b= person(a);//这句person(a)是什么意思
上一篇:
一个小程序,报些问题怪!
相关文章
vs2005开发mfc为什么在别的电脑上无法运行?
c语言高手回答这个奇怪的数字转圈圈
请问单件模式为什么要用静态方法来实现?
help?
operator new 为何不被调用
终于2个裤衩了,也帮大家散散分,顺便讨论下关于...
类摸板中友元函数在调用时编译通不过
小程序
关于mouse_event中相对移动的dy,dx问题
asn.1介绍中文文档下载 !
关于vc6.0
请指教哪里错啦
如何判断用户输入的是一个数字而非一个字符或者一...
指针类型转换,难题
想用c++编写一个模拟速度控制的程序,想请教一下...
求教高手!!!
c++算法,看看谁会做????
自做软件怎样发布?
我到底应该怎么学编程
大家帮我看一下这段代码吧
其他资讯
请求:怎样才能显示的慢一点
一个另我头痛的问题
为什么用了string 类就出错,不会用string
一个关于cannot convert parameter的e...
edit控件如何获取数据
一个很简单的笔试题但是很难答对,关于类定义的
【版规】新手乐园版规v1.0
诚寻成都c++高手,小弟有一程序搞不定了
libmemcache有人用过吗???
求一道难题的算法!
请问c++中有没有栈这个类啊
半价转让全新的《c++程序设计与应用》,张耀仁著...
输出从小到大的数问题
怎么给字符串数组赋值?
编写“销毁链表”这个操作时,是否连头指针也释放...
求简历学习,只需工作经历和个人总结(summary)...
运算结果????
怎么样拆分字符串,最好不要涉及到复杂的指针,新...
关于<高质量c++c编程指南>这本书的唯一困惑...
请问c++与java的编程思想是否一样?
快速检索
分类导航标签a
其他数据库开发InterBase
产品/厂家中国软件技术大会
WebSphereIntegratorr
C++ Builder网络及通讯开发
VBVBA
Windows专区Vista
其他数据库开发VFP
产品/厂家中国软件技术大会
其他数据库开发Anywhere
WebSphere开发工具/WSAD
专题开发/技术/项目设计模式
产品/厂家程序员大本营
C++ Builder数据库及相关技术
移动平台开发应用
扩充话题程序人生
最新资讯
如何子对话框调用另一子对话框变量
导出数据时出错,电脑提示 activex 部件...
【群】:35339261-asp.net with c#编...
有了解blackberry开发的吗?知道的进,不知道的顶...
用delphi 开发 jabber客户端
c#如何接收数据
求助:repeater控件如何横向显示数据?
we looking for ror...
java程序逻辑探讨
框架间传值的问题
用java开发工具能自动为servlet和jsp生成部署文件...
db2指示符变量问题,请指点,谢谢
请问如何在自己开发的应用程序中(c#)添加aspx...
1
¦m¦ 幕白兄关于打印问题:td的...
在vs。net2005中如何新建解决方案
求书
求救!!!
怎样传递cptrarray?
关于c++写一个简单com中的小问题
c#人员招聘,工作地点:北京
如何实现图片不间断向上滚动?
想实现与功率计cp320的rs22通讯 如何实现进...
在 delphi 里如何防止用户频繁用f5键刷...
关于在datagridview中对cell赋值的问题!
关于hibernate 的一个sum()输出问题
只能用http://localhost和http://127.0.0.1访问,...
高手在那里呀~~急呀,从数据库取数问题
在c#2003中用api使用串口,要如何设置类似vb中rt...
如何关闭一个已被删除的文件的句柄?
英特尔主动管理技术能不能应用在linux系统下?
.0100 float 前面一个0哪...
编译结果都有就是写入文件的时候就是一个#!怎么解...
dllregisterserver 失败
有个页面用xmlhttp组件只能得到一部分内容,谁能帮...
根据鼠标或光标所在控件不同,设置div的位置
gridview 结合 ajax实现投票功能 ...
window form中在一个 datagridview&nb...
hibernate多表查询时为什么用<one-to-many>...
请教关于setfilepointer和irp_mj_set_informatio...
热门点击
oracle中关于查看会话信息的问题
散分,一个痛苦的人
一段关于指针的问题,高手看一下。弄不明白,先上...
求助des加密问题
值得关注的安全问题!
问题太难了!
在线求助小问题,在线给分
关于重载<<的问题,请大家帮我解答
新手问题 请各位帮忙!先谢了!!
求助:.h文件的内部函数调用问题
如果用了wf工作流处理审批流程,那以前用数据库方...
关于b/s中实现"实时"的问题
新做的网站,大家来顶顶~
一个关于界面图形按钮的问题
这个问题谁能给个准确的说法?谢谢了
关于typedef和struct的问题
请教,数据量过大怎么处理?
treeview问题无法正常显示
求一sql语句,请高手多多帮忙.....................
急:请问各位高手有没有将wav文件格式编码为二进...
数据库设计问题
如何使用rapi?
求一条简单的sql语句
求一随机数的算法
紧急,不小心执行了rd /s,有没办法恢复?
那位大仙可以帮帮我啊,在c#中怎么用三层架构把数...
从做系统到做网页我该注意什么?
哭求+跪求+拜求!询问asp.net发布的一个问题
mfc类
求一个sql语句!
这是小弟的一个多播代码,麻烦高手看一下问题在哪...
多个asp站使用同一个sql数据库的问题?
c#重绘控件时:怎样去掉from\button控件的所有背景...
msbcode9.ocx 问题 有点难度
第2季度c#版版务专用帖
struts标签的问题
统计问题
vba 方法方面的问题:我要写一个vba方...
在datagridview上按回车的问题?
扩展名为fc的flash资源文件怎么调用里面的东西??...