虚函数继承调用问题

alice_2860 2009-09-18 11:04:07
class A
{
public:
virtual void fun()
{
cout<<"AAAAAAA"<<endl;
}
};

class B:public A
{
private:
void fun()
{
cout<<"BBBBBBB"<<endl;
}
};

void main()
{
A a,*p;
B b;
p=&b;
b.fun();
p->fun();
}

b.fun();这句调用是不对的,因为它调用的是私有成员函数
p->fun();这句为何调用却是对的呢,而且输出结果是BBBBBBB!!!感觉不可思议,又是虚函数的问题吗??请讲细点,谢谢!
...全文
136 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzh_endless 2009-09-18
  • 打赏
  • 举报
回复
private 仅仅作为编译器的部分检查
不能被外界调用也是有前提条件的
x15988649286 2009-09-18
  • 打赏
  • 举报
回复
class B中的fun()声明在private,在类外是不能被访问的。因为在基类声明了fun()为虚函数,所以在派生类中的fun()也是虚函数,则函数的调用会根据实际情况而调用(p=&b)
拉卡尼休 2009-09-18
  • 打赏
  • 举报
回复
将基类中的虚函数定义为公有的,而将派生类的同名虚函数定义为protected或private是没有意义的,因为总可以将派生类向上转型到基类,然后调用基类的虚函数,这个时候实际上可以通过晚绑定访问到派生类的protected或private虚函数。
steven_007 2009-09-18
  • 打赏
  • 举报
回复
b.fun(); 没有动态联编。
madpc 2009-09-18
  • 打赏
  • 举报
回复
我倒是觉得很合情理

p=&b; //指向 A 类型
zz578 2009-09-18
  • 打赏
  • 举报
回复
从来没这样写过,我也觉得这个结果有点奇怪,难道它不违背OOP的封装原则吗?
oLINo 2009-09-18
  • 打赏
  • 举报
回复
基类指针调用虚函数,会根据虚表找到指定的函数地址,而不管函数的声明。如果不是虚函数,就会调用到A中的FUN
wanjingwei 2009-09-18
  • 打赏
  • 举报
回复
对于
B b;
A *p=&b这样的,而fun又是虚拟的,p->fun()调用的是B类的fun函数
alice_2860 2009-09-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 olino 的回复:]
基类指针调用虚函数,会根据虚表找到指定的函数地址,而不管函数的声明。如果不是虚函数,就会调用到A中的FUN
[/Quote]
感觉有点奇怪,private不会阻止P的访问吗,感觉很奇怪,p->fun()竟然能访问成功,能详细说下嘛?
kobemouse 2009-09-18
  • 打赏
  • 举报
回复
b.fun()只是编译器通不过而已,也就是说如果有办法让编译器通过了,运行期是不会出问题的。而p->fun()则正好“骗”过了编译器。
asd_123 2009-09-18
  • 打赏
  • 举报
回复
p是指向的A类型,可访问由多态性引起的
chengzhe 2009-09-18
  • 打赏
  • 举报
回复
b 直接调用自然会错误, 因为是私有的

编译器不会检查域的可见性的

65,186

社区成员

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

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