关于C++中同名覆盖的问题

bluescorpio 2009-05-06 11:27:05
如下一段代码,想请问一下输出结果是什么?并能给与解释~~~

class Base
{
public:
void fun1()
{
cout<<"Base fun1"<<endl;
}

void fun2()
{
fun1();
}
};

class Derived: public Base
{
public:
void fun1()
{
cout<<"Derived fun1"<<endl;
}
};

void main()
{
Derived d;
d.fun2();
return;

...全文
391 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
liliangbao 2009-05-07
  • 打赏
  • 举报
回复
如果是动态编译就可以知道了~
liliangbao 2009-05-07
  • 打赏
  • 举报
回复
因为Base::fun2()中fun1()不是虚函数,所以就使用静态编译了,而对于Base::fun2()根本就知道Base::fun1(),而不知道Derived::fun1()这样的函数~
你不可以让基类函数去调用派生类独有的函数吧~
中才德创 2009-05-06
  • 打赏
  • 举报
回复
在fun2里是调用的Base::fun1而不是Derived::fun1。
原因在于,它是静态绑定好了的。你可以观感下它的反汇编,早早就是call Base::fun1.
而如果Base::fun1被申明为virtual,它的反汇编就会变成一大摞的了,大意是透过_vfnptr指针间接调用fun1了。而这个指针就会对象挂钩了,最终调用了Derived::fun1。
lingyin55 2009-05-06
  • 打赏
  • 举报
回复
class Base
{
public:
void fun1()
{
cout<<"Base fun1"<<endl;
}

void fun2()
{
fun1();
}
};
在这个类里面,编译器怎么可能会知道还有一个Derived fun1?

[Quote=引用 10 楼 bluescorpio 的回复:]
引用 7 楼 lingyin55 的回复:
引用 5 楼 bluescorpio 的回复:
to liliangbao:
能解释一下为什么“在Base::fun2()中可见的是Base::fun1()”吗?这个可见性有些什么规则吗?

to mengde007:
正如你所说,改为虚函数后,得到了 "Derived fun1”的输出,这样我就更迷惑了,这里没有使用指针,编译器又是怎么来处理的呢?能不能给我解释一下?

谢谢二位


这里不是可见性的问题,Derived继承了Base,那么Derived也…
[/Quote]
pengzhixi 2009-05-06
  • 打赏
  • 举报
回复
对fun2函数里面调用的fun1来说,首先 是在Base类里面找,如果找不到就会找全局的.如果没找到就会报错
pengzhixi 2009-05-06
  • 打赏
  • 举报
回复
to liliangbao:
能解释一下为什么“在Base::fun2()中可见的是Base::fun1()”吗?这个可见性有些什么规则吗?

这个要去看下名字查找规则,对Base::fun2()来说只有Base::fun1()是可见的.
bluescorpio 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 HelloDan 的回复:]
看到有几个回复的就知道别人都解释得差不多的了。。。。
[/Quote]

呵呵,我比较笨,理解起来有点慢~~
bluescorpio 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lingyin55 的回复:]
引用 5 楼 bluescorpio 的回复:
to liliangbao:
能解释一下为什么“在Base::fun2()中可见的是Base::fun1()”吗?这个可见性有些什么规则吗?

to mengde007:
正如你所说,改为虚函数后,得到了 "Derived fun1”的输出,这样我就更迷惑了,这里没有使用指针,编译器又是怎么来处理的呢?能不能给我解释一下?

谢谢二位


这里不是可见性的问题,Derived继承了Base,那么Derived也可以调用Base中的函数,这里其实…
[/Quote]

其实我想知道的就是d是Derived的对象,通过它来调用fun2(虽然它没有直接定义,但从Base继承下来)时,为什么在fun2里是调用的Base::fun1而不是Derived::fun1,毕竟我是通过Derived的对象调用的啊
HelloDan 2009-05-06
  • 打赏
  • 举报
回复
看到有几个回复的就知道别人都解释得差不多的了。。。。
bluescorpio 2009-05-06
  • 打赏
  • 举报
回复

[Quote=引用 6 楼 hairetz 的回复:]
楼主到底想问什么,直接说明吧。这样一个问题50分,实在不不值。
[/Quote]

我想问的是:调用d.fun2()时,fun2确实在派生类中没有定义,但在fun2中又调用fun1,fun1在派生类中有同名覆盖,那为什么在fun2中调用的是Base::fun1而不是Derived::fun1呢?
同时,如果fun1改为虚函数,则就会调用到Derived::fun1呢?
lingyin55 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 bluescorpio 的回复:]
to liliangbao:
能解释一下为什么“在Base::fun2()中可见的是Base::fun1()”吗?这个可见性有些什么规则吗?

to mengde007:
正如你所说,改为虚函数后,得到了 "Derived fun1”的输出,这样我就更迷惑了,这里没有使用指针,编译器又是怎么来处理的呢?能不能给我解释一下?

谢谢二位
[/Quote]

这里不是可见性的问题,Derived继承了Base,那么Derived也可以调用Base中的函数,这里其实就是调用了Base中的fun1.
当Base fun1改成虚函数后,说明你要在子类中对这个虚函数进行重载,所以当你调用虚函数时,其实调用的是继承类中的一个重载版本。
  • 打赏
  • 举报
回复
楼主到底想问什么,直接说明吧。这样一个问题50分,实在不不值。
bluescorpio 2009-05-06
  • 打赏
  • 举报
回复
to liliangbao:
能解释一下为什么“在Base::fun2()中可见的是Base::fun1()”吗?这个可见性有些什么规则吗?

to mengde007:
正如你所说,改为虚函数后,得到了 "Derived fun1”的输出,这样我就更迷惑了,这里没有使用指针,编译器又是怎么来处理的呢?能不能给我解释一下?

谢谢二位
  • 打赏
  • 举报
回复
输出Base fun1

fun2只有基类才有,所以直接调用Base::fun2()啊。
子类实例可以调用基类的成员函数,很正常啊。
liliangbao 2009-05-06
  • 打赏
  • 举报
回复
d.fun1();//这样调用时会发生覆盖,子类Derived中函数fun1()覆盖父类的fun1().
mengde007 2009-05-06
  • 打赏
  • 举报
回复
输出Base fun1;因为d调用的是Base的fun2();而内部调用了Base的fun1();很正常;
如果fun1函数是虚拟的话;那么将会输出Derived fun1;
liliangbao 2009-05-06
  • 打赏
  • 举报
回复
输出:
Base fun1

d.fun2();//就是调用Base::fun2()函数,而fun2中调用的就是Base::fun1()了,这里不发生什么覆盖,因为在Base::fun2()中可见的是Base::fun1()

65,211

社区成员

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

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