C++基类子类中,虚函数究竟是怎样判断该调用哪个函数的?? 20

father*p=newson;fahter是基类,son是子类。假设voidprintf()这个函数基类子类中都有。现在我把基类中变为虚函数:virtualvoidpr... father *p = new son ;

fahter 是基类,son是子类。

假设 void printf() 这个函数基类子类中都有。现在我把基类中变为虚函数:
virtual void printf();

那么 p->printf();调用的就是子类函数。

这是为什么?哪里有写着要调用子类函数了?为什么不是调用基类函数?
展开
 我来答
lzfvvv
2013-06-19
知道答主
回答量:21
采纳率:100%
帮助的人:13.6万
展开全部
有虚函数时,每个对象的this指针都指向一个虚函数表(Virtual Table)的地址,这个表里存的就是虚函数的地址。编译的时候就决定了,普通函数调用时直接CALL这个函数的地址,而是虚函数时,是从这个虚表里取地址去调用的。
更多追问追答
追问
每个对象的this指针都指向一个虚函数表。。。。。。。每个对象?你是说基类子类的this指针都指向虚函数表?????

我设定的是基类函数为虚函数,按此说法,这是从虚表里调用的,那也应该调用的是基类的虚函数啊?
追答
父类的这个函数是虚函数,子类里自然也是了,子类里这个关键字是可省略的

补充一下:
如果觉得我的回答难理解,可以就记住一个概念:普通函数是属于类的,虚函数是属于对象的。
也就是说,普通函数,指针类型是哪个类的,调用的函数就那个类的。
虚函数,不管指针类型是那个类的,你new的是谁,决定你最终调用的是谁的函数。
陈975675159
2013-06-19
知道答主
回答量:50
采纳率:0%
帮助的人:9.7万
展开全部
定义了虚函数之后,在执行的时候,系统会自动的匹配与之相对应的合适的成员函数。
这里的话p是指向son的指针,那么他会先调用son里面的成员函数。
更多追问追答
追问
p是指向son的指针,那么他会先调用son里面的成员函数。如果我没有设立虚函数呢?p是指向son的指针呀,它怎么不调用son函数?
追答
没有设置的时候,系统会默认先调用基类里面的函数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xm...c@163.com
2016-05-29
知道答主
回答量:1
采纳率:0%
帮助的人:1120
展开全部
你问:那么 p->printf();调用的就是子类函数?

原因:由于子类重载了基类的虚函数,所以在子类对象的虚函数表里面的函数地址是子类的,而不是父类的,所以p->printf(),肯定调用的是子类的printf函数了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
只是小小的略懂
2013-06-19
知道答主
回答量:21
采纳率:0%
帮助的人:8.1万
展开全部
如果子类实现了的就掉子类,子类没实现的就调父类的。
更多追问追答
追问
不懂!
追答
看你基类实现printf()这个函数没。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
师大江湖浪子
2015-04-10 · 超过10用户采纳过TA的回答
知道答主
回答量:57
采纳率:0%
帮助的人:23.9万
展开全部
这就是所谓的多态,请看看C++ Primer
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式