+ -
当前位置:首页 → 问答吧 → 现在该干吗?

现在该干吗?

时间:2011-10-25

来源:互联网

对于以下代码
#include"iostream"
using namespace std;

class A
{
public:
void set(int x){cout<<"A"<<endl;}
};

class B:public A
{
public:
void set(int x,int y){cout<<"B"<<endl;}
};

int main()
{
B s;
s.set(2);
return 0;
}
无法通过编译,我个人觉得是简单的重载,怎么会出现同名隐藏呢?求解。。。。。

作者: zhenxini   发布时间: 2011-10-25

代码:
  1 #include"iostream"
  2 using namespace std;
  3
  4 class A
  5 {
  6     public:
  7     void set(int x){cout<<"A"<<endl;}
  8 };
  9
10 class B:public A
11 {
12     public:
13     void set(int x,int y){cout<<"B"<<endl;}
14 };
15
16 int main()
17 {
18     B s;
19     s.A::set(2);
20     return 0;
21 }

你这里的s.set(2),默认是s.B::set(2),编译器发现这个函数并不存在,报错,不要被书本的东西误导,
想想编译器的行为,了解一些符号修饰之类的东西对你有好处。

作者: youqika   发布时间: 2011-10-25

但寻名字机制应该可以找到啊,公有继承方式下,A的set函数应该成了B的公有成员,也该是外界接口啊,。。。。。。

作者: zhenxini   发布时间: 2011-10-25

编译器根据你的声明生成符号表,然后调用的地方填入该符号,后面会变成正确的地址
逻辑上说编译器应该提供你所说的功能,但是如果B覆盖的set函数第一个参数有默认值,然后两个参数类型一样,
编译器就不知道你要调用哪个函数了,这也是设计上的考虑,所以才需要明确地告诉编译器
如果你一定要拿书本说事的话这就是传说中的隐藏了

作者: youqika   发布时间: 2011-10-25

这位大虾推荐一下了解编译器相关工作的书籍,不胜感激。。。。。。。

作者: zhenxini   发布时间: 2011-10-25

对于以下代码
#include"iostream"
using namespace std;

class A
{
public:
void set(int x){cout<<"A"<<endl;}
};

class B:public A
{
public:
void set(int x,int y){cout<<"B"<<endl;}
};

int main()
{
B s;
s.set(2);
return 0;
}
无法通过编译,我个人觉得是简单的重载,怎么会出现同名隐藏呢?求解。。。。。

作者: zhenxini   发布时间: 2011-10-25

代码:
  1 #include"iostream"
  2 using namespace std;
  3
  4 class A
  5 {
  6     public:
  7     void set(int x){cout<<"A"<<endl;}
  8 };
  9
10 class B:public A
11 {
12     public:
13     void set(int x,int y){cout<<"B"<<endl;}
14 };
15
16 int main()
17 {
18     B s;
19     s.A::set(2);
20     return 0;
21 }

你这里的s.set(2),默认是s.B::set(2),编译器发现这个函数并不存在,报错,不要被书本的东西误导,
想想编译器的行为,了解一些符号修饰之类的东西对你有好处。

作者: youqika   发布时间: 2011-10-25

但寻名字机制应该可以找到啊,公有继承方式下,A的set函数应该成了B的公有成员,也该是外界接口啊,。。。。。。

作者: zhenxini   发布时间: 2011-10-25

编译器根据你的声明生成符号表,然后调用的地方填入该符号,后面会变成正确的地址
逻辑上说编译器应该提供你所说的功能,但是如果B覆盖的set函数第一个参数有默认值,然后两个参数类型一样,
编译器就不知道你要调用哪个函数了,这也是设计上的考虑,所以才需要明确地告诉编译器
如果你一定要拿书本说事的话这就是传说中的隐藏了

作者: youqika   发布时间: 2011-10-25

这位大虾推荐一下了解编译器相关工作的书籍,不胜感激。。。。。。。

作者: zhenxini   发布时间: 2011-10-25