【发布时间】:2014-10-14 17:56:32
【问题描述】:
#include<iostream>
using namespace std;
class ParentClass {
public:
virtual void someFunc(int a){
printf(" ParentClass :: someFunc (int) \n");
};
virtual void someFunc(int* a){
printf(" ParentClass :: someFunc (int*) \n");
};
};
class ChildClass : public ParentClass {
public:
virtual void someFunc(int* a){
printf(" ChildClass :: someFunc(int*) \n");
};
};
int main(){
ChildClass obj;
/* This function call results in an error: */
obj.someFunc(7);
}
第一个给出错误
tr2.cpp: In function 'int main()':
tr2.cpp:27:19: error: invalid conversion from 'int' to 'int*' [-fpermissive]
obj.someFunc(7);
^
tr2.cpp:18:18: error: initializing argument 1 of 'virtual void ChildClass::som
eFunc(int*)' [-fpermissive]
virtual void someFunc(int* a){
^
但是如果我们将方法更改为接受 char 而不是 int* 那么
#include<iostream>
using namespace std;
class ParentClass {
public:
virtual void someFunc(int a){
printf(" ParentClass :: someFunc (int) \n");
};
virtual void someFunc(char a){
printf(" ParentClass :: someFunc (char) \n");
};
};
class ChildClass : public ParentClass {
public:
virtual void someFunc(char a){
cout<<a<<endl;
printf(" ChildClass :: someFunc(char) \n");
};
};
int main(){
ChildClass obj;
/* This function call results in an error: */
obj.someFunc(7);
}
输出:
ChildClass :: someFunc(char)
带有窗户声音(叮)。 - ANS:此处为隐式转换。请检查下面的编辑。
所以名称隐藏在第一个示例中有效,但在第二个示例中无效。谁能解释为什么?我也尝试过使用不同数量的参数制作重载的重写虚函数,例如 int func(int a) , int func (int a, int b),然后只覆盖其中一个。在这种情况下,名称隐藏也不起作用,派生类能够派生未覆盖的基类的虚函数。
为什么这个名字隐藏只在这种特殊情况下有效?
编辑 1:
With Context to Eternals 对隐式转换的解释。我有另一个应该隐藏名称但没有的程序。在这个版本中,方法是根据不同的参数数量来区分的。
#include<iostream>
using namespace std;
class ABC
{ public:
ABC()
{
cout<<"Constructor ABC"<<endl;
}
virtual void meth1(int a);
virtual void meth2(int a, int b);
};
void ABC :: meth1(int a)
{
cout<<"One"<<endl;
}
void ABC:: meth2(int a, int b)
{
cout<<"Two"<<endl;
}
class BC:public ABC
{
public:
BC()
{
cout<<"Cons B"<<endl;
}
void meth1(int a);
};
void BC :: meth1(int a)
{
cout<<"Three"<<endl;
}
int main()
{
BC b;
b.meth1(5);
b.meth2(6,7);
}
输出:
C:\Users\Shaurya\Desktop>a
Constructor ABC
Cons B
Three
Two
在这种情况下,名称隐藏也不起作用。
【问题讨论】:
-
附注:为什么
cout和printf()的奇怪组合?? -
'int' 和 'char' 重载不明确。
-
我从一个网站上复制了这个例子,看看其他不同的案例。网站上提到的案例是为了隐藏名字。但我试过的情况没有。我使用更多的 cout,他们使用 printf。
-
第二个版本中没有
int*,我看不出错误消息是如何引用的。你确定你复制的正确吗? -
错误信息对应第一个程序
标签: c++ name-hiding