C++ 虚基类,二义性问题

shenchangm 2011-10-28 07:01:46
#include"iostream.h"

class A
{
public:
void fun(){cout<<"A::fun()"<<endl;}
};
class B:public A
{
public:
void fun(){cout<<"B::fun()"<<endl;}
};
class C:public B
{
public:
void fun(){cout<<"C::fun()"<<endl;}
};
void f(A *p)
{p->fun();}
main()
{
A a;
B b;
C c;
A *p;
p=&a;
f(p);
p=&b;
f(p);
p=&c;
f(p);
}
这里面 有三个类都有fun()到底执行 p=&b;
f(p);
p=&c;
f(p);
这个的时候为什么B和C类的fun() 都不能输出了?
...全文
102 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
huanzhi1990 2011-10-29
  • 打赏
  • 举报
回复
对,得用到虚函数!类A前面加关键字virtual就行了!
zzcmx2008 2011-10-29
  • 打赏
  • 举报
回复
mark
jixiang1983 2011-10-28
  • 打赏
  • 举报
回复
要达到动态绑定效果,应注意两点:
1.基类中那个函数被设为虚函数(类定义中函数前加virtual)
2.程序调用过程中使用指向基类的指针来实现动态绑定
对象 2011-10-28
  • 打赏
  • 举报
回复
普通函数是static binding,普通函数的意义在于强制实现,什么类型调用的就执行这个类型的函数。

虚函数的意义之一就是dynamic binding,根据指针指向类型来动态调用函数,但是函数输入缺省值仍然是静态的。
羽飞 2011-10-28
  • 打赏
  • 举报
回复
基类A的函数fun不是虚函数,你用指针或者引用都不能达到动态绑定的效果
函数f接受的是一个指向A的指针,调用的总是A的fun函数
想达到动态绑定的效果必须将A的fun设为virtual
nand库路泽 2011-10-28
  • 打赏
  • 举报
回复
二楼说的好!!
samzboy 2011-10-28
  • 打赏
  • 举报
回复
先好好看看 C++ 的多态和继承吧
caoxuan350298788 2011-10-28
  • 打赏
  • 举报
回复
各位说的真好,学习了

64,651

社区成员

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

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