declaration of 'Superclass x' shadows a parameter是什么意思

helloDesword 2013-01-23 07:11:03
class Superclass
{
public:
Superclass(int);
}

class Subclass : public Superclass
{
public:
Subclass(int);
}

按如上方式的基类和子类的带参数的构造函数。
如果按照一般的方式子类的构造函数应该是:
Subclass::Subclass(int x): Superclass(x)
{ . . . }

但如果我这样做
Subclass::Subclass(int x): 
{
Superclass::Superclass(x);
}


就会报出这样的错
error: no matching function for call to `Superclass::Superclass()‘
error: declaration of 'Superclass x' shadows a parameter
error: no matching function for call to `Subclass::Subclass ()‘
请教各位大神,declaration of 'Superclass x' shadows a parameter 是什么意思的?
这是为什么错了?谢谢,初学c++。多多指教!~~~
...全文
1431 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
helloDesword 2013-01-25
  • 打赏
  • 举报
回复
引用 4 楼 mujiok2003 的回复:
C/C++ code?12345678910111213141516class Subclass : public Superclass{public:Subclass(int x) { Superclass::Superclass(x);}/*以上相当于Subclass(int x) : Superclass()//1.调用基类的缺省构造函数{ Supercla……
那么这样的话: class Subclass : public Superclass { public: Subclass(int x) :Superclass(x) { } 就能够覆盖默认的构造器了吧?
mujiok2003 2013-01-25
  • 打赏
  • 举报
回复

//Case 1
struct A
{
  //编译器会按需插入默认构造函数
};
A a; //OK

//Case 2
struct B
{
  //因为有了自定义的构造函数,编译器将不再生成默认构造函数
  B(int x){}
};
B b; //需要调用默认构造函数,error

//Case 3
struct C
{
  //因为有了自定义的构造函数,编译器将不再生成默认构造函数
  C(int x){}
  //我可以自己加上无参构造函数
 C(){}
};
C c; //OK, 调用无参构造函数
希望你明白了。 [quote=引用 8 楼 ls1160 的回复:] 按照典型的用法写构造器的话,就不会调用系统默认的构造函数了吧quote]
helloDesword 2013-01-25
  • 打赏
  • 举报
回复
引用 7 楼 mujiok2003 的回复:
引用 6 楼 ls1160 的回复:引用 4 楼 mujiok2003 的回复:C/C++ code?12345678910111213141516class Subclass : public Superclass{public:Subclass(int x) { Superclass::Superclass(x);}/*以上相当于Subclass(int x) :……
对呀。我的意思就是按照典型的用法写构造器的话,就不会调用系统默认的构造函数了吧。就像你之前举过的那个相当于的例子那样,后面的默认构造函数就没了。 而且哦,既然基类里面是已经定义了自定义的构造函数了,那么就编译器就不会产生默认构造函数,那么你举的那个例子里面怎么会又调用了默认的构造函数呢?还是说,你的那个只是单纯的可以这么看,实质上不是这样呢?多多指教。
mujiok2003 2013-01-25
  • 打赏
  • 举报
回复
引用 6 楼 ls1160 的回复:
引用 4 楼 mujiok2003 的回复:C/C++ code?12345678910111213141516class Subclass : public Superclass{public:Subclass(int x) { Superclass::Superclass(x);}/*以上相当于Subclass(int x) : Superclass()//1.调……
这是典型的用法。不明白“覆盖默认的构造器”指什么。写了自定义的构造函数,编译器将不再生产默认构造函数。
mujiok2003 2013-01-24
  • 打赏
  • 举报
回复
引用 3 楼 mujiok2003 的回复:
构造函数不能显示调用。 C/C++ code?1Superclass::Superclass(x);
忽略这个。
mujiok2003 2013-01-24
  • 打赏
  • 举报
回复



class Subclass : public Superclass
{
public:
Subclass(int x) 
{
   Superclass::Superclass(x);
}
/*
以上相当于
Subclass(int x) : Superclass()//1.调用基类的缺省构造函数
{
   Superclass::Superclass(x);//2. 调用基类的带参构造函数
   //调用了两次基类的构造函数,这是不允许的。
}
*/
};


mujiok2003 2013-01-24
  • 打赏
  • 举报
回复
构造函数不能显示调用。
Superclass::Superclass(x);
漫步者、 2013-01-24
  • 打赏
  • 举报
回复
Subclass::Subclass(int x): //你要么去掉你的冒号,你的做法首先得去符合人家的语法才行呢! { Superclass::Superclass(x);//这个是可以的 }
漫步者、 2013-01-24
  • 打赏
  • 举报
回复
class Superclass { public: Superclass(int); }; class Subclass : public Superclass { public: Subclass(int); }; 定义完类之后,用分号结束。

65,186

社区成员

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

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