弱弱问下

olla168 2007-06-18 11:00:02
这里有几个问题!希望大虾指点一、二,能牺牲一下宝贵时间,说的仔细一点!谢谢!^_^
问题1:
#include <iostream.h>
class base
{
public:
void fun();
};
class derived:public base
{
public:
void fun(int a);
};

void base::fun()
{
cout<<"base::fun"<<endl;
}
void derived::fun(int a)
{
cout<<"derived::fun:"<<a<<endl;
}
void main()
{
base bobj1;
derived dobj;
base &bobj2 = dobj;
dobj.fun(10);
//dobj.fun();/*error C2660: 'fun' : function does not take 0 parameters*/
bobj2.fun();/*可以!base::fun*/
bobj1.fun();
}
这里派生类对象不能调用无参的fun函数,不明白是派生类没有继承到基类无参的fun函数?还是继承了不能调用?为什么??一个是有参一个是无参,为什么会屏蔽呢?

问题2:
#include <iostream.h>
class base
{
public:
virtual void fun();
virtual void fun1();
};
class derived:public base
{
public:
void fun(int a);
};

void base::fun()
{
cout<<"base::fun"<<endl;
}
void base::fun1()
{
cout<<"base::fun1"<<endl;
}
void derived::fun(int a)
{
cout<<"derived::fun:"<<a<<endl;
}
void main()
{
base bobj1;
derived dobj;
dobj.fun(10);
dobj.fun();/*error C2660: 'fun' : function does not take 0 parameters*/
dobj.fun1();/*right!base::fun1*/
bobj1.fun();
}
这里按理说派生类中应该自己会有代参的fun函数,并且继承了基类的virtual的无参fun函数,也就是说,派生类对象会含有一个指向虚函数表指针,指向虚函数表,这个虚函数表应该和基类相同才是!但是查看了一下对象的布局如下,不解!
-dobj {...}
--|-base {...}
----|-__vfptr 0x004270dc const derived::`vftable'
[0] 0x0040101e base::fun(void)
[1] 0x00401037 derived::fun(void)
-bobj1 {...}
--|-__vfptr 0x00426034 const base::`vftable'
[0] 0x0040101e base::fun(void)
[1] 0x00401037 derived::fun(void)

不解:基类虚函数表中怎么会没有fun1函数指针?怎么会有派生类函数derived::fun()指针?而且参数是空?!

问题3:
多态性是单纯指虚拟函数的应用,还是继承和虚拟函数所表现出来的逗都属于多态性的范畴?好多书本不太一致。我越看越糊涂啦!^_^



...全文
306 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lotomer 2007-06-19
  • 打赏
  • 举报
回复
重载不是多态
重写基类的virtual函数才可以多态
xlbdan 2007-06-18
  • 打赏
  • 举报
回复
1.本来是继承的,但因为你在子类里也写了fun函数,而且又不是与父类的fun函数形成虚函数对,所以子类的fun掩盖了父类的fun

2.对于fun的问题同上,因为你的子类与父类的fun函数参数表不同,所以没有构成虚函数,即子类的fun掩盖父类的fun. 而父类的fun1并没有被子类掩盖(因为子类没有定义叫fun1的东西)
al0n9 2007-06-18
  • 打赏
  • 举报
回复
1.当派生类中,有同名函数时,基类中的同名函数被隐藏。如果想在派生类中访问基类中的同名函数,可能通过完整的作用域引用方式,也就是base_class_name::fun()的形式。或者在派生类中使用引用声明。using base_class_name::fun;
2.派生类重写基类中的虚函数时,有一个严格的限制:参数的类型必相同(以对象为参数里,可以是公有派生自同一个基类的派生类)。如果参数的个数或者类型不同,那么,派生类中的同名函数会隐藏基类中的同名函数。
3.。。。。。你只要理解多态是什么意思就行了,到底哪个属于哪个不属于,完全是学究们才关心的事。
mudunke775 2007-06-18
  • 打赏
  • 举报
回复
问题1解答:函数名相同却不是虚函数,系统会自动覆盖原函数。
taodm 2007-06-18
  • 打赏
  • 举报
回复
你还是买本《深度探索c++对象模型》来研究吧。
olla168 2007-06-18
  • 打赏
  • 举报
回复
个人更倾向于是,只是看到有的书上好像不是这么说,有的是,比较混!^_^
olla168 2007-06-18
  • 打赏
  • 举报
回复
谢谢lotomer关于问题1的回答!第3各问题说错了,想问的是重载是不是也是属于多态?
xuejinn 2007-06-18
  • 打赏
  • 举报
回复
mark
lotomer 2007-06-18
  • 打赏
  • 举报
回复
问题3解答:
不继承哪来多态?
lotomer 2007-06-18
  • 打赏
  • 举报
回复
问题2的解答和问题1的解答是一样的,见我上面对问题1的解答
lotomer 2007-06-18
  • 打赏
  • 举报
回复
问题1解答:
名字查找规则是这样的:首先在派生类中查找,看是否存在该名字的函数(暂时不考虑参数和返回值的),如果在派生类中找到了这个名字,查找即中止,然后再看找到的这个是不是符合条件(参数和返回值),如果没有找到则去基类中查找。。。
所以遇到dobj.fun()时,编译器首先在derived类中查找fun这个名字,结果找到了,因此他不会再去base类中查找,找到以后再看这个fun函数是不是符合要求,结果当然是不符合啦(derived类中的是带有参数的哦),因而编译不能通过。
要解决这个办法,在derived类中这样申明一下就可以了,using base::fun;这样做就是告诉编译器,base::fun这个名字是可见的,在查找名字时也要考虑他。
DLMU_net 2007-06-18
  • 打赏
  • 举报
回复
第一个问题,一言以蔽之,多态性只有虚函数才会有,再就是“只有指针和引用才能支持多态性”,mudunke775(竹本无心)说的对,函数会被覆盖掉,如果你调用:bobj2.fun(10),一样错。
olla168 2007-06-18
  • 打赏
  • 举报
回复
隐藏的规则是知道的,只是不太理解:在同一个类中,2个具有不同参数、函数名相同的函数就可以重载,在问题1上为什么不是派生类将基类的无参fun函数继承过来和自己的有参fun函数重载呢?为什么要屏蔽掉基类的呢?不屏蔽又不会造成二义性!
PS:谢谢你们热心得回答!想给回答加分,怎么弄啊?呵呵

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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