鱼C论坛

 找回密码
 立即注册
查看: 2866|回复: 12

[已解决]c++基类、子类及赋初值没学明白

[复制链接]
发表于 2018-3-7 11:27:42 | 显示全部楼层 |阅读模式
1鱼币
自己测试程序,但有错误,还请高手帮忙找错
  1. #include <iostream>
  2. #include <string>

  3. class Department                                       //基类:部门
  4. {
  5.     public:
  6.     std::string DepName;

  7.     Department(std::string theName);           //基类构造器声明
  8.     ~Department();

  9.     void room();                                            //基类方法声明
  10. };

  11. class Members:public Department                 //子类:成员
  12. {
  13.     public:
  14.     std::string MemName;

  15.     Members(std::string theName);                //子类构造器声明
  16.     ~Members();

  17.     void work(std::string theName);              //子类方法声明
  18. };

  19. Department::Department(std::string theName)         //基类构造器定义
  20. {
  21.     DepName=theName;
  22.     std::cout<<"部门名称:"<<DepName<<std::endl;
  23. };


  24. Members::Members(std::string theName):Department(theName)        //子类构造器定义
  25. {
  26.    
  27. };

  28. void Department::room()                                                                       //基类方法定义
  29. {
  30.     std::cout<<"房间号:405-2"<<std::endl;
  31. }

  32. void Members::work(std::string theName)                                              //子类方法定义
  33. {
  34.     std::cout<<theName<<"正在努力工作"<<std::endl;
  35. }

  36. int main()
  37. {
  38.     Members M1="张三";                                                             //子类成员1张三
  39.     Department D1("研发部");                                                      //基类部门1研发

  40.     D1.room();                                                                              //调用基类方法
  41.     M1.work(M1.MemName);                                                          //调用子类方法

  42.     return 0;
  43. };
复制代码


错误提示:
QQ截图20180307112638.png

自己没弄明白错在哪里
最佳答案
2018-3-7 11:27:43
fairylee83 发表于 2018-3-7 13:25
33行是子类构造器继承基类构造器,所以为空啊?
我看小甲鱼的视频里是这样写的。

对不起,之前没仔细看
这里因为逻辑不对,“张三”是一个人名,你将它初始化了一个部门的名称
所以以为你没有进行初始化

你的代码的问题在于不能这样初始化一个对象
用 ="张三"是不行的,需要用括号的方式

最佳答案

查看完整内容

对不起,之前没仔细看 这里因为逻辑不对,“张三”是一个人名,你将它初始化了一个部门的名称 所以以为你没有进行初始化 你的代码的问题在于不能这样初始化一个对象 用 ="张三"是不行的,需要用括号的方式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-7 11:27:43 | 显示全部楼层    本楼为最佳答案   
fairylee83 发表于 2018-3-7 13:25
33行是子类构造器继承基类构造器,所以为空啊?
我看小甲鱼的视频里是这样写的。

对不起,之前没仔细看
这里因为逻辑不对,“张三”是一个人名,你将它初始化了一个部门的名称
所以以为你没有进行初始化

你的代码的问题在于不能这样初始化一个对象
用 ="张三"是不行的,需要用括号的方式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-7 11:47:31 | 显示全部楼层
你的构造函数都没写,初始化的时候如何知道将“张三”赋值给谁?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-7 13:11:00 | 显示全部楼层
BngThea 发表于 2018-3-7 11:47
你的构造函数都没写,初始化的时候如何知道将“张三”赋值给谁?

构造函数是指构造器吗?26行不是基类构造器定义吗?
学得有点晕。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-7 13:17:31 | 显示全部楼层
fairylee83 发表于 2018-3-7 13:11
构造函数是指构造器吗?26行不是基类构造器定义吗?
学得有点晕。

你那是基类的构造函数,子类的构造函数呢?第33行,函数实现为空
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-7 13:25:25 | 显示全部楼层
BngThea 发表于 2018-3-7 13:17
你那是基类的构造函数,子类的构造函数呢?第33行,函数实现为空

33行是子类构造器继承基类构造器,所以为空啊?
我看小甲鱼的视频里是这样写的。
QQ截图20180307132443.png
我再按您说的调试一下试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-7 13:30:01 | 显示全部楼层
BngThea 发表于 2018-3-7 13:17
你那是基类的构造函数,子类的构造函数呢?第33行,函数实现为空
  1. #include <iostream>
  2. #include <string>

  3. class Department
  4. {
  5.     public:
  6.     std::string DepName;

  7.     Department(std::string theName);
  8.     ~Department();

  9.     void room();
  10. };

  11. class Members:public Department
  12. {
  13.     public:
  14.     std::string MemName;

  15.     Members(std::string theName);
  16.     ~Members();

  17.     void work(std::string theName);
  18. };

  19. Department::Department(std::string theName)
  20. {
  21.     DepName=theName;
  22.     std::cout<<"部门名称:"<<DepName<<std::endl;
  23. };


  24. Members::Members(std::string theName):Department(theName)
  25. {
  26. MemName=theName;
  27. };

  28. void Department::room()
  29. {
  30.     std::cout<<"房间号:405-2"<<std::endl;
  31. }

  32. void Members::work(std::string theName)
  33. {
  34.     std::cout<<theName<<"正在努力工作"<<std::endl;
  35. }
  36. int main()
  37. {
  38.     Members M1="张三";
  39.     Department D1("研发部");

  40.     D1.room();
  41.     M1.work(M1.MemName);

  42.     return 0;
  43. };
复制代码


QQ截图20180307132914.png
是这样改吗?还是不行哦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-7 13:52:22 | 显示全部楼层
fairylee83 发表于 2018-3-7 13:30
是这样改吗?还是不行哦。

第49行,
Members M1("张三");

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-7 14:00:43 | 显示全部楼层
BngThea 发表于 2018-3-7 11:27
对不起,之前没仔细看
这里因为逻辑不对,“张三”是一个人名,你将它初始化了一个部门的名称
所以以为 ...

重新改了
  1. #include <iostream>
  2. #include <string>

  3. class Department
  4. {
  5.     public:
  6.     std::string DepName;

  7.     Department(std::string theName);
  8.     ~Department();

  9.     void room();
  10. };

  11. class Members:public Department
  12. {
  13.     public:
  14.     std::string MemName;

  15.     Members(std::string theName);
  16.     ~Members();

  17.     void work(std::string theName);
  18. };

  19. Department::Department(std::string theName)
  20. {
  21.     DepName=theName;
  22.     std::cout<<"部门名称:"<<DepName<<std::endl;
  23. };
  24. Department::~Department()
  25. {
  26. }


  27. Members::Members(std::string theName):Department(theName)
  28. {

  29. };
  30. Members::~Members()
  31. {
  32. }

  33. void Department::room()
  34. {
  35.     std::cout<<"房间号:405-2"<<std::endl;
  36. }

  37. void Members::work(std::string theName)
  38. {
  39.     std::cout<<theName<<"正在努力工作"<<std::endl;
  40. }
  41. int main()
  42. {
  43.     Members M1("张三");
  44.     Department D1("研发部");

  45.     D1.room();
  46.     M1.work(M1.MemName);

  47.     return 0;
  48. };
复制代码

QQ截图20180307134952.png
改了,程序运行算是没错了。但是运行程序得出的结果和我预想的有出入。
1、张三赋给了部门。我的设想是赋给成员名。这个是因为子构造器和基构造器继承的关系吗?改子的,基的也变?
2、我想通过M1.work(M1.MemName)打印张三正在努力工作。好像也没成功。
3、Member M1("张三");这是对构造器赋值还是对Member类对象M1的MemName属性赋值?
学成浆糊了。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-7 14:06:09 | 显示全部楼层

是的,所以你还需要对基类的构造函数简单改造一下,可以重写一个默认构造函数,然后子类构造的时候不要对基类进行初始化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-7 14:25:27 | 显示全部楼层
BngThea 发表于 2018-3-7 14:06
是的,所以你还需要对基类的构造函数简单改造一下,可以重写一个默认构造函数,然后子类构造的时候不要对 ...
  1. #include <iostream>
  2. #include <string>

  3. class Department
  4. {
  5.     protected:
  6.     std::string DepName;

  7.     public:
  8.     Department(std::string theName);
  9.     ~Department();

  10.     public:
  11.     void room();
  12. };

  13. class Members:public Department
  14. {
  15.     public:
  16.     std::string MemName;

  17.     Members(std::string theName);
  18.     ~Members();

  19.     void work(std::string theName);
  20. };

  21. Department::Department(std::string theName)
  22. {
  23.     DepName=theName;
  24.     std::cout<<"部门名称:"<<DepName<<std::endl;
  25. };
  26. Department::~Department()
  27. {
  28. }


  29. Members::Members(std::string theName)
  30. {
  31. MemName=theName;
  32. };
  33. Members::~Members()
  34. {
  35. }

  36. void Department::room()
  37. {
  38.     std::cout<<"房间号:405-2"<<std::endl;
  39. }

  40. void Members::work(std::string theName)
  41. {
  42.     std::cout<<theName<<"正在努力工作"<<std::endl;
  43. }
  44. int main()
  45. {
  46.     Members M1("张三");
  47.     Department D1("研发部");

  48.     D1.room();
  49.     M1.work(M1.MemName);

  50.     return 0;
  51. };
复制代码


QQ截图20180307142309.png

改成protected吗?然后子构造器不继承基构造器?

还是出错,快被虐哭了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-7 14:48:03 | 显示全部楼层
fairylee83 发表于 2018-3-7 14:25
改成protected吗?然后子构造器不继承基构造器?

还是出错,快被虐哭了

不要着急,我根据你的思路给你一个简单的写法,你自己好好参考一下
  1. #include <iostream>
  2. #include <string>

  3. class Department
  4. {
  5. public:
  6.         std::string DepName;
  7.         Department(){} //这里,添加一个默认构造函数即可
  8.         Department(std::string theName);
  9.         ~Department();

  10. public:
  11.         void room();
  12. };

  13. class Members:public Department
  14. {
  15. public:
  16.         std::string MemName;

  17.         Members(std::string theName);
  18.         ~Members();

  19.         void work();
  20. };

  21. Department::Department(std::string theName)
  22. {
  23.         DepName=theName;
  24.         std::cout<<"部门名称:"<<DepName<<std::endl;
  25. };
  26. Department::~Department()
  27. {
  28. }


  29. Members::Members(std::string theName)
  30. {
  31.         MemName=theName;
  32. };
  33. Members::~Members()
  34. {
  35. }

  36. void Department::room()
  37. {
  38.         std::cout<<"房间号:405-2"<<std::endl;
  39. }

  40. void Members::work()//不需要形参,直接用成员变量即可
  41. {
  42.         std::cout<<MemName<<"正在努力工作"<<std::endl;
  43. }

  44. int main()
  45. {
  46.         Members M1("张三");
  47.         Department D1("研发部");

  48.         D1.room();
  49.         M1.work();

  50.         return 0;
  51. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-3-7 14:54:29 | 显示全部楼层
BngThea 发表于 2018-3-7 14:48
不要着急,我根据你的思路给你一个简单的写法,你自己好好参考一下

谢谢大神
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 07:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表