关于虚函数一个很奇怪问题

liuqingwu228 2007-07-30 03:58:05
#include "stdio.h"
#include "iostream.h"
class Base
{
private:
int a;
public:
void set(int t)
{
a=t;
}
void g()
{
cout<<"Base:"<<a<<endl;
}
void g(int t)
{
cout<<"Base:"<<t<<endl;
}
virtual void f(int t)
{
cout<<"Base:"<<t<<endl;
}
void h(int t)
{
cout<<"Base:"<<t<<endl;
}


};
/*一个 要public 继承 ,默认继承是没有用*/
class Deiv : public Base
{
private:
float Dval;
public:
void g(int t)
{
cout<<"Deiv:"<<t<<endl;
}
void f(int t)
{
cout<<"Deiv:"<<t<<endl;
}
void h(float t)
{
cout<<"Deiv:"<<t<<endl;
}

};
void main()
{
Base bs,*td;
Deiv tm;
td=&tm;
tm.h(3); //打印 deiv,为什么不打印Base?
tm.h(3.3);
td->h(3);//这个是打印 Base的

printf("Hello");
}
为什么tm.h(3); //打印 deiv,为什么不打印Base? Base g()里面是int 参数啊,不是应该先打印这个吗?
...全文
198 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
boost_star 2007-07-30
  • 打赏
  • 举报
回复
我们经常会犯一个错误,就是希望基类和派生类的成员函数构成一个重载函数集,虽然基类的成员可以直接被访问,但是它们仍然属于基类的域。一个名字的重载侯选函数必须出现在同一域中。如果想实现重载可以使用 using Base::h;
第二个问题是关于虚函数的问题。
liuqingwu228 2007-07-30
  • 打赏
  • 举报
回复
谢谢上面大侠,原来只要子类中有跟父类同名函数,父类中同名函数都会被覆盖
nkgd 2007-07-30
  • 打赏
  • 举报
回复
不是覆盖,是遮蔽。简单的说,如果子类中定义了一个同名函数,那么父类中的同名函数就被遮蔽而不再可见,编译器在匹配函数的时候不会再在父类中去寻找这个名字的函数,除非你使用一个使用声明——也就是前面所说的using Base::h——将父类同名函数导入子类。
很多语言类的书中都有这个说明的,lz你找本书详细看看吧。
liuqingwu228 2007-07-30
  • 打赏
  • 举报
回复
子类将父类的同名函数隐藏了?
子类中继承了void h(int t),难道子类里面可以用void h(float t)来覆盖void h(int t)?
virusswb 2007-07-30
  • 打赏
  • 举报
回复
子类覆盖父类的f函数了
你的父类的f函数不是虚函数啊
在子类里面也没有重写啊
概念问题啊
squallchao 2007-07-30
  • 打赏
  • 举报
回复
感觉楼主的意思像是h()函数是virtual的,不过就算如此在子类继承后,子类中的同名函数也会覆盖父类中的函数。
nkgd 2007-07-30
  • 打赏
  • 举报
回复
另外,你那个h函数也不是虚函数,所以其实这个问题是与虚函数无关而与函数匹配查找顺序有关的问题。
在这种情况下要实现你想要的那个结果的话,在Deiv类中public部分添加:
using Base::h;
nkgd 2007-07-30
  • 打赏
  • 举报
回复
名字遮蔽了,这个时候是看不到父类中那个同名函数的。
将Deiv h( int t )换成Deiv h( char *t ),可以更清楚的看到发生了什么。

这个问题是函数匹配查找顺序的问题,很多书上都有说明的。
lddLinan 2007-07-30
  • 打赏
  • 举报
回复
子类将父类的同名函数隐藏了
channey007 2007-07-30
  • 打赏
  • 举报
回复
h()不是虚函数,所以tm.h(int)和td->h(int)的调用是在编译时就确定了的:
1)因为tm是Deiv类型,所以tm.h(int)调用Deiv::h(int)
2)因为td是Base*类型,所以td->h(int)调用Base::h(int)

其实在真实的项目中,没有人会像这样设计h(int)函数,因为会造成混乱。

***************
正解!可以参看《深度探索C++对象模型》
ochinchina 2007-07-30
  • 打赏
  • 举报
回复
h()不是虚函数,所以tm.h(int)和td->h(int)的调用是在编译时就确定了的:
1)因为tm是Deiv类型,所以tm.h(int)调用Deiv::h(int)
2)因为td是Base*类型,所以td->h(int)调用Base::h(int)

其实在真实的项目中,没有人会像这样设计h(int)函数,因为会造成混乱。
taodm 2007-07-30
  • 打赏
  • 举报
回复
C++ Primer没认真看过吧,关于这个函数名字搜索问题,上面讲得非常详细的。

33,311

社区成员

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

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