免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 15235 | 回复: 16
打印 上一主题 下一主题

[C++] C++中带参数、拷贝构造函数的继承问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-19 17:56 |只看该作者 |倒序浏览
我这样写:

  1. class Base{
  2. public:
  3.         Base();
  4.         Base(int);
  5.         Base(Base&);
  6.         Base& operator=( Base& other);
  7. private:
  8.         int m_i;
  9. };

  10. class Derive : public Base{
  11. public:
  12.         Derive();
  13. };

  14. int main()
  15. {
  16.         Derive d(12);
  17.         Derive other(d);
  18.         Derive c;
  19.         c = d;
  20. }
复制代码
]
我用g++编译,得到这样的信息:
"错误:对 ‘Derive:erive(int)’ 的调用没有匹配的函数"

我的问题是,带参数的构造函数不能继承吗?为什么?Derive:erive(Derive&拷贝继承函数、复制函数的继承也不太明白。望大虾指教。

论坛徽章:
0
2 [报告]
发表于 2006-04-19 18:09 |只看该作者
构造函数无法实现你这里所说的"继承",只能被派生类调用,但是operator可以继承.

[ 本帖最后由 converse 于 2006-4-19 18:15 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-04-19 18:14 |只看该作者
如果你没有自己提供一个copy ctor和default ctor的话,那么编译器会帮你生成一个,在里面调用基类的相应的ctor:


  1. #include <iostream>
  2. using namespace std;
  3. class Base{
  4. public:
  5.         Base(){}
  6.         Base(int){}
  7.         Base(Base&)
  8.         {
  9.          cout << "Base() copy ctor\n";
  10.         }
  11.         Base& operator=( Base& other)
  12.         {
  13.               cout << "operator = in Base\n";
  14.               
  15.               return other;
  16.         }
  17. private:
  18.         int m_i;
  19. };

  20. class Derive : public Base{
  21. public:
  22.         Derive(){}
  23. };

  24. int main()
  25. {
  26.         Derive d;
  27.         Derive other(d);
  28.         Derive c;
  29.         c = d;
  30.         getchar();
  31.         
  32.         return 0;
  33. }

复制代码

论坛徽章:
0
4 [报告]
发表于 2006-04-19 22:25 |只看该作者
谢谢版主大哥。
也就是说编译器会自动为我生成copy ctor和default ctor以及operator=三个函数;在编译器生成的copy ctor和default ctor中会调用基类的构造函数,但不是继承的基类的构造函数。如果我定义了一个带参数的构造函数, 如Base(int){},但是派生类却没有Derive(int)这样的构造函数;为什么不能继承这个函数。

派生类里不定义operator=但是base类里定义了,那么派生类里的operator=是继承的基类的,还是编译器自动生成一个?如果是继承的,那么如果派生类里定义了新的数据,这个运算符就要定义成virtual了?而且就算派生类里新定义的数据就算没有指针,不自己重新定义运算符,新的数据就不会正确被复制,是吗?

再有,如果需要定义成virtual,在定义中需要调用基类的=运算符是不是这样写:
  1. this=>Base::operator=(other);
复制代码

论坛徽章:
0
5 [报告]
发表于 2006-04-19 22:42 |只看该作者
纠正一下我上面的说法,
>>果你没有自己提供一个copy ctor和default ctor的话,那么编译器会帮你生成一个,在里面调用基类的相应的ctor:

这句话不对,应该是这样子:如果你已经定义了其他的ctor而没有提供copy和default ctor,那么编译器也不会为你提供了;反之,如果你的类里面没有任何ctor,那么编译器为为你生成这两个ctor.
如:

  1. class Test
  2. {
  3.     Test(int) // 定义了非copy和default的ctor
  4.    {
  5.    }
  6. };

  7. int main()
  8. {
  9.      Test t;

  10.      return 0;
  11. }
复制代码

以上这段代码就是编译不过去的,因为缺少default ctor,但是如果test类中原来没有任何的ctor就是可以过去的

但是,只要为你生成就会去调用基类的ctor,至于如何调用以及是否能够正确调用就不好说了,所以如果你对编译器的行为不放心还是自己做这一块.

[ 本帖最后由 converse 于 2006-4-19 22:43 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2006-04-19 22:45 |只看该作者
>>如Base(int){},但是派生类却没有Derive(int)这样的构造函数;为什么不能继承这个函数。
没懂,这两个函数函数名称都不一样了,如何能够在调用int的derive构造的时候找不到定义就去找base里面的呢?这个显然是不合理的.

>>派生类里不定义operator=但是base类里定义了,那么派生类里的operator=是继承的基类的,还是编译器自动生成一个?
如果派生类没有,就去基类找,再没有,编译器就会为你生成了.

论坛徽章:
0
7 [报告]
发表于 2006-04-19 22:56 |只看该作者
是不是说构造函数不能继承?copy cotor是什么啊

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2006-04-19 23:04 |只看该作者
好像只有类的继承,没有函数的继承吧?

论坛徽章:
0
9 [报告]
发表于 2006-04-19 23:13 |只看该作者
原帖由 converse 于 2006-4-19 22:42 发表
这句话不对,应该是这样子:如果你已经定义了其他的ctor而没有提供copy和default ctor,那么编译器也不会为你提供了;反之,如果你的类里面没有任何ctor,那么编译器为为你生成这两个ctor.


这样说不对吧,应该是你定义了其他的ctor而没有提供default ctor,那么编译器不会为你提供default ctor;
虽然定义了其他的ctor,如果没有定义copy ctor那么编译器仍然会提供copy ctor的。

  1. #include <iostream>
  2. using namespace std;

  3. class A{
  4. public:
  5.         A(int i) :m_i(i){}
  6.         void print() { cout<<m_i<<endl; }
  7. private:
  8.         int m_i;
  9. };

  10. int main()
  11. {
  12. //        A a1;
  13.         A a2(2);
  14.         A a3(a2);
  15.         a3.print();
  16.         return 0;
  17. }
复制代码

可以通过编译。输出为2,说明copy ctor由编译器自动提供给我们的。

[ 本帖最后由 2eye 于 2006-4-19 23:15 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2006-04-19 23:15 |只看该作者

回复 9楼 2eye 的帖子

没错,谢谢指正!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP