虚函数继承调用问题

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!!!感觉不可思议,又是虚函数的问题吗??请讲细点,谢谢!
...全文
105 点赞 收藏 12
写回复
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 直接调用自然会错误, 因为是私有的

编译器不会检查域的可见性的
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告