虚函数

vcgaoshou 2013-09-17 10:28:01
#include<iostream>
using namespace std;
class A{
public:
A(){f();}
void f(){cout<<"A::f()"<<endl;g();}
virtual void g(){cout<<"A::g()"<<endl;}
};
class B: public A{
public:
void f(){cout<<"B::f()"<<endl;g();}
void g(){cout<<"B::g()"<<endl;}
};
int main(){
A *pa;
A a; //调用A::A(),A::f()
B b; //调用B::B(),A::A(),A::f()
pa=&b;
pa->f(); //调用A::f(),B::g()
return 0;
}
f()不是虚函数,g()是虚函数.为什么在pa->f()中,f调用了派生类B的g(),而不是基类A的g().基类f对g的从调用难道不是在编译时绑定的吗?
...全文
136 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
To_be_sky 2013-09-17
  • 打赏
  • 举报
回复
pa是A的对象,所以pa->f()调用A::f() pa=&b;你把pa指向了b,g()是虚函数, 所以不会调用A::g()。 这个就是多态。
FancyMouse 2013-09-17
  • 打赏
  • 举报
回复
>基类f对g的从调用难道不是在编译时绑定的吗? 不是。因为A::g被声明了虚函数,所以A::f里的g调用依然会查虚函数表。 你如果想说B b;里调用了A::f和A::g的话,那是因为在A::A()里,子类的虚函数表还未初始化,所以调用f再调用g,这个g会调用到A::g上去,即使你最终这个类的类型是B……所以effective c++才会建议不要在构造函数里调用虚函数,因为会导致和你期望的不同的结果。
qinken547 2013-09-17
  • 打赏
  • 举报
回复
建议lz把虚函数的用法和作用多看看,很多书上应该都有基类指针对虚函数的调用的
namelcz 2013-09-17
  • 打赏
  • 举报
回复
因为你pa=&b;进行了强转。而g()是虚函数。所以调用b:g()
turing-complete 2013-09-17
  • 打赏
  • 举报
回复
只要是不在构造函数和析构函数中调用g(),那么它就是动态绑定的。
zybjtu 2013-09-17
  • 打赏
  • 举报
回复
虚函数是运行时才能决定。 你的

A *pa;
A a;	 //调用A::A(),A::f()
B b;	 //调用B::B(),A::A(),A::f()
pa=&b;
pa->f();	 //调用A::f(),B::g()
return 0;
这种用法就是典型的虚函数运作原理。 编译时是指针是哪个类型就调用那个类型的函数。 此时pa虽然是A的指针,但是指向&b,这样就造成了晚捆绑。
max_min_ 2013-09-17
  • 打赏
  • 举报
回复
http://blog.csdn.net/haoel/article/details/1948051/ 仔细看看这个博客!好好体会下虚函数,虚函数表
Universe_Admin 2013-09-17
  • 打赏
  • 举报
回复
建议楼主看下虚函数与虚函数表的相关知识。pa里面的虚函数表,指向的是B的虚函数g()

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧