覆盖还是重载的问题

kingteng 2008-12-28 11:41:05
#include<iostream>   
using namespace std;
class AA
{
public:
void show(int a)
{
cout<<"AA::show"<<endl;
}
};
class BB :public AA
{
public:
void show(double b,int c)
{
cout<<"BB::show"<<endl;
}
};

class CC:public BB
{};
int main()
{
CC one;
one.show(8);
}

为什么AA中的show在BB中被隐藏了,我以为是重载的,能解释一下吗
...全文
99 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
up
kingteng 2008-12-28
  • 打赏
  • 举报
回复
谢谢各位清楚了
kingteng 2008-12-28
  • 打赏
  • 举报
回复
error C2385: 'CC::show' is ambiguous
xiaoyisnail 2008-12-28
  • 打赏
  • 举报
回复
不好意思,上面没看到你新的代码

你后来那里是多重继承,编译器在两个父类里都会进行名字查找,并找到了两个匹配,所以是二义性
nullah 2008-12-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kingteng 的回复:]
哦,那为什么这个是调用二义性呢
C/C++ code#include<iostream>
using namespace std;
class AA
{
public:
void show(int a)
{
cout<<"AA::show"<<endl;
}
};
class BB
{
public:
void show(double b)
{
cout<<"BB::show"<<endl;
}
};

class CC:public AA,public BB
{};

[/Quote]
那是因为你的CC中有两个show()一个是AA中的一个是BB中的
编译器无法选择
可以这样调用

#include<iostream>
using namespace std;
class AA
{
public:
void show(int a)
{
cout<<"AA::show"<<endl;
}
};
class BB
{
public:
void show(double b)
{
cout<<"BB::show"<<endl;
}
};

class CC:public AA,public BB
{};
int main()
{
CC one;
one.AA::show(3.0);
}
lann64 2008-12-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kingteng 的回复:]
哦,那为什么这个是调用二义性呢
[/Quote]
一样的道理呀,先从名字空间查找,两个父类都有名字show,不知道用那个来匹配,当然是二义。这个二义给重载时的二义不是一回事。
这时候根本就不检查函数签名,首先检查函数名字,决定用那个父类的函数做下一步检查。
xiaoyisnail 2008-12-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kingteng 的回复:]
哦,那为什么这个是调用二义性呢
C/C++ code
#include<iostream>
using namespace std;
class AA
{
public:
void show(int a)
{
cout<<"AA::show"<<endl;
}
};
class BB
{
public:
void show(double b)
{
cout<<"BB::show"<<endl;
}
};

class CC:public AA,public BB
{};
int main()
{…
[/Quote]

报的错是二义性?不对吧?应该是参数不匹配才对
lann64 2008-12-28
  • 打赏
  • 举报
回复
不会重载的,是被隐藏了。同一层作用域里才会重载。
kingteng 2008-12-28
  • 打赏
  • 举报
回复
哦,那为什么这个是调用二义性呢
#include<iostream>   
using namespace std;
class AA
{
public:
void show(int a)
{
cout<<"AA::show"<<endl;
}
};
class BB
{
public:
void show(double b)
{
cout<<"BB::show"<<endl;
}
};

class CC:public AA,public BB
{};
int main()
{
CC one;
one.show(3.0);
}
oyljerry 2008-12-28
  • 打赏
  • 举报
回复
子类的是覆盖父类的
重载在同一个类中
xiaoyisnail 2008-12-28
  • 打赏
  • 举报
回复
重载是发生在同一作用域里的
这里的show是在不同的作用域内,编译器在名字查找时在子类中找到了show就不会再到父类的作用域中查找这个名字,所以子类的show隐藏掉了父类中的show,这里发生的是覆盖

65,211

社区成员

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

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