C++基类子类中,虚函数究竟是怎样判断该调用哪个函数的?? 20
father*p=newson;fahter是基类,son是子类。假设voidprintf()这个函数基类子类中都有。现在我把基类中变为虚函数:virtualvoidpr...
father *p = new son ;
fahter 是基类,son是子类。
假设 void printf() 这个函数基类子类中都有。现在我把基类中变为虚函数:
virtual void printf();
那么 p->printf();调用的就是子类函数。
这是为什么?哪里有写着要调用子类函数了?为什么不是调用基类函数? 展开
fahter 是基类,son是子类。
假设 void printf() 这个函数基类子类中都有。现在我把基类中变为虚函数:
virtual void printf();
那么 p->printf();调用的就是子类函数。
这是为什么?哪里有写着要调用子类函数了?为什么不是调用基类函数? 展开
5个回答
展开全部
有虚函数时,每个对象的this指针都指向一个虚函数表(Virtual Table)的地址,这个表里存的就是虚函数的地址。编译的时候就决定了,普通函数调用时直接CALL这个函数的地址,而是虚函数时,是从这个虚表里取地址去调用的。
更多追问追答
追问
每个对象的this指针都指向一个虚函数表。。。。。。。每个对象?你是说基类子类的this指针都指向虚函数表?????
我设定的是基类函数为虚函数,按此说法,这是从虚表里调用的,那也应该调用的是基类的虚函数啊?
追答
父类的这个函数是虚函数,子类里自然也是了,子类里这个关键字是可省略的
补充一下:
如果觉得我的回答难理解,可以就记住一个概念:普通函数是属于类的,虚函数是属于对象的。
也就是说,普通函数,指针类型是哪个类的,调用的函数就那个类的。
虚函数,不管指针类型是那个类的,你new的是谁,决定你最终调用的是谁的函数。
展开全部
定义了虚函数之后,在执行的时候,系统会自动的匹配与之相对应的合适的成员函数。
这里的话p是指向son的指针,那么他会先调用son里面的成员函数。
这里的话p是指向son的指针,那么他会先调用son里面的成员函数。
更多追问追答
追问
p是指向son的指针,那么他会先调用son里面的成员函数。如果我没有设立虚函数呢?p是指向son的指针呀,它怎么不调用son函数?
追答
没有设置的时候,系统会默认先调用基类里面的函数。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你问:那么 p->printf();调用的就是子类函数?
原因:由于子类重载了基类的虚函数,所以在子类对象的虚函数表里面的函数地址是子类的,而不是父类的,所以p->printf(),肯定调用的是子类的printf函数了。
原因:由于子类重载了基类的虚函数,所以在子类对象的虚函数表里面的函数地址是子类的,而不是父类的,所以p->printf(),肯定调用的是子类的printf函数了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果子类实现了的就掉子类,子类没实现的就调父类的。
更多追问追答
追问
不懂!
追答
看你基类实现printf()这个函数没。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这就是所谓的多态,请看看C++ Primer
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询