帮忙看一看学妹写的C++程序的问题吧

时间:2021-01-16 14:15:48
js类中的js1对象在建立时,为什么会调用kf类和sc类中的构造函数?

#include<iostream.h>
#include<string.h>
//int gh=10;
class rs
{
protected:
char *xm;//姓名
float accumpay;//月薪总额

public:
rs();
      ~rs();
  virtual void pay()=0;
  virtual void show()=0;
};
rs::rs()
{accumpay=0.0;};
rs::~rs()
{delete[] xm;};
void rs::pay(){};


class xs:public rs//销售部类
{protected:
    int yx;
float commrate;//提成百分比
float sales;//销售总额
public:
xs()
{ char xm1[8];
cout<<"请输入销售部员工的姓名 :";
cin>>xm1;
xm=new char[strlen(xm1)+1];
strcpy(xm,xm1);
yx=3000;
commrate=0.5f;};

void pay()
{  cout<<"请输入"<<xm<<"本月的销售额总额:";
cin>>sales;
accumpay=yx+commrate*sales;
};
void show()

cout<<"销售部员工:"<<xm<<"  "<<"本月工资(底薪+销售总额*提成50%)="<<accumpay<<endl;
};
};



class kf: virtual public rs//开发部类
{protected:
float yx;//月薪
public:
 kf(){
char xm1[8];
cout<<"请输入开发部经理的姓名:";
cin>>xm1;
xm=new char[strlen(xm1)+1];
strcpy(xm,xm1);

yx=10000;};
void pay(){accumpay=yx;

}
void show()
{ cout<<"开发部经理="<<xm<<"    "<<"本月工资(固定工资)="<<accumpay<<endl;
   };
};



class sc: virtual public rs//生产部类
{
protected:
float yx;//月薪
int scze;//生产总额
float commrate;//生产提成百分比

public:
 sc()
{ char xm1[8];
cout<<"请输入生产部员工的姓名:";
cin>>xm1;
xm=new char[strlen(xm1)+1];
strcpy(xm,xm1);
yx=3000;
commrate=0.3f;
};
void pay(){

cout<<"请输入"<<xm<<"本月的生产总额:";
cin>>scze;
    accumpay=yx+scze*commrate;

};
void show()
{cout<<"生产部员工="<<xm<<"   "<<"本月工资(底薪+生产总额*提成30%)="<<accumpay<<endl;
};
};



class js:public kf,public sc//技术部类
{ private:
float sx;//时薪
int gs;//工时
public:
js(){  char xm1[8];
cout<<"请输入技术部员工的姓名:";
cin>>xm1;
xm=new char[strlen(xm1)+1];
strcpy(xm,xm1);
sx=200;};//时薪;
void pay()
{
cout<<"请输入"<<xm<<"本月的工作时数:";
cin>>gs;
accumpay=sx*gs;
};
void show()
{
cout<<"技术部员工="<<xm<<"  "<<"本月工资(时薪*工时)="<<accumpay<<endl;
};
};


void  main()
{
char i,j;
int quit=0;
do
{
cout<<"\t"<<endl;
cout<<"--------------欢迎使用苹果人员信息管理系统----------------"<<endl;
cout<<"@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@  "<<endl;
cout<<"         1------销售部                                   "<<endl;
cout<<"         2------开发部                                   "<<endl;
cout<<"         3------生产部                                   "<<endl;
cout<<"         4------技术部                                   "<<endl;
cout<<"         5------ 查询                                     "<<endl;
cout<<"         0------退出                                      "<<endl;
cout<<"@@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ @@ "<<endl;
cout<<" 请选择菜单号:(0--5)"<<endl;
cin>>j;

switch(j)
{  
case'1': {xs xs1;
      xs1.pay();
         xs1.show();}
          break;
case'2': {kf kf1;
       kf1.pay();
          kf1.show();}
          break;
case'3': {sc sc1;
      sc1.pay();
          sc1.show();}
          break;
case'4': {js js1;
     // js2.js1();
          js1.pay();
          js1.show();}
           break;
case '5':{xs xs1; 
kf kf1; 
sc sc1; 
js js1;}break;//xs1.show();kf1.show();sc1.show();js1.show();
case'0': { cout<<"您是要退出吗?是--请输入y或Y,否--请输入n或N"<<endl;
       cin>>i;
    if(i=='y' || i=='Y')
  {quit=1;
cout<<"成功退出!"<<endl;}
           else
   { quit=0;
   cout<<"请继续!"<<endl;}}
   break;
default: cout<<"输入错误!"<<endl;
      break;
}
}while(!quit);
}

21 个解决方案

#1


派生类在构造对象时,会先调用其基类的构造函数。在析构对象时,最后会调用其基类的析构函数。在C++的书上,都会说到这个滴,妹妹看书不认真了吧?

要想知道为什么会这样,在坛子里可能很难说清楚。妹妹不妨先记住这个结论,等C++内功提升到了一定层次后,可以自行研习Inside C++ Object Model。

#2


引用 1 楼 pathuang68 的回复:
派生类在构造对象时,会先调用其基类的构造函数。在析构对象时,最后会调用其基类的析构函数。在C++的书上,都会说到这个滴,妹妹看书不认真了吧?

要想知道为什么会这样,在坛子里可能很难说清楚。妹妹不妨先记住这个结论,等C++内功提升到了一定层次后,可以自行研习Inside C++ Object Model。


我如果只要调用派生类的构造函数,应该怎样解决呢?

#3


除非基类是默认构造函数

#4


引用 2 楼 xph4444 的回复:
我如果只要调用派生类的构造函数,应该怎样解决呢?

这还叫面向对象/继承么?
如果是这样,类继承体系设计错了。

#5


最近也在写一个类似的管理程序,C++的类继承机制妳要先弄懂啊。

#6


哎 认真看看C++的书 类的基本知识点 都说得很清楚了 

要是你上学时听过老师教C++ 那只能说你大学教你C++编程的老师 该被枪毙了 

#7


初学者,看不懂

#8


派生类在构造对象时,会先调用其基类的构造函数。在析构对象时,最后会调用其基类的析构函数。这就是继承与派生,你先去看看书吧

#9


c++ primer plus(第五版)第十三章 类继承
建议您好好研读研读

#10


学妹的东西总是有很多人关注!

#11


我一直以为学妹是指,发帖人的学妹,从来都不帮着看!

#12


学妹的贴很多人回

#13


新手表示压力很大!

#14


基类析构函数也要虚拟,不然析构的时候要出错

#15


学妹,以你现在的C++认知 完全可以去学学VC方面的 MFC相关  向你所写的东西 在MFC中都可以很直观的体现出来 而且可以做的漂漂亮亮的 功能都能做的很全面 基本语法和纯C++类似 很好入门的

#16


引用 2 楼 xph4444 的回复:
引用 1 楼 pathuang68 的回复:

派生类在构造对象时,会先调用其基类的构造函数。在析构对象时,最后会调用其基类的析构函数。在C++的书上,都会说到这个滴,妹妹看书不认真了吧?

要想知道为什么会这样,在坛子里可能很难说清楚。妹妹不妨先记住这个结论,等C++内功提升到了一定层次后,可以自行研习Inside C++ Object Model。


我如果只要调用派生类的构造……

如果这样的派生还能叫做派生吗?

#17


一楼正解。A类如果是B类的派生类,意思就是A类具有B类的所有“属性”,所谓构造函数就是要构造出类的“属性”,你生成A类对象的时候不让调用B类的构造函数,就相当于不让A类的对象具有某些属于B类的“属性”。现实之中可以理解为,男人类是人类的派生类,人类有身高和体重两个“属性”,男人类也继承了这两个“属性”,人类的构造函数其实就是在生成人类对象的时候初始化这两个“属性”(当然也可能有其他动作),如果男人类在生成一个男人对象的时候不调用人类的构造函数,其实就相当于这个男人对象没有初始化这两“属性”。我就是这样理解的,不知道是否恰当,仅供参考。

#18


继承问题。
派生类对象的定义时,要先调用父类的构造函数。

#19


学妹的变量名设置得不好
例如xm,姓名应该用name
yx;这个月薪吗?应该用income

#20


    js(){  char xm1[8];
cout<<"请输入技术部员工的姓名:";
cin>>xm1;
xm=new char[strlen(xm1)+1];
    strcpy(xm,xm1);
sx=200;};//时薪;

为什么要把这些东西写到构造函数里面呢  有违常理  不支持这样做    这些代码完全可以写到另一个函数里来调用  构造的时候就避免了 出现群主的情况。    继承是构造是由上到下的,写多了就会明白的,时间会告诉你的

#21


看到贴后,感到鸭梨很大

#1


派生类在构造对象时,会先调用其基类的构造函数。在析构对象时,最后会调用其基类的析构函数。在C++的书上,都会说到这个滴,妹妹看书不认真了吧?

要想知道为什么会这样,在坛子里可能很难说清楚。妹妹不妨先记住这个结论,等C++内功提升到了一定层次后,可以自行研习Inside C++ Object Model。

#2


引用 1 楼 pathuang68 的回复:
派生类在构造对象时,会先调用其基类的构造函数。在析构对象时,最后会调用其基类的析构函数。在C++的书上,都会说到这个滴,妹妹看书不认真了吧?

要想知道为什么会这样,在坛子里可能很难说清楚。妹妹不妨先记住这个结论,等C++内功提升到了一定层次后,可以自行研习Inside C++ Object Model。


我如果只要调用派生类的构造函数,应该怎样解决呢?

#3


除非基类是默认构造函数

#4


引用 2 楼 xph4444 的回复:
我如果只要调用派生类的构造函数,应该怎样解决呢?

这还叫面向对象/继承么?
如果是这样,类继承体系设计错了。

#5


最近也在写一个类似的管理程序,C++的类继承机制妳要先弄懂啊。

#6


哎 认真看看C++的书 类的基本知识点 都说得很清楚了 

要是你上学时听过老师教C++ 那只能说你大学教你C++编程的老师 该被枪毙了 

#7


初学者,看不懂

#8


派生类在构造对象时,会先调用其基类的构造函数。在析构对象时,最后会调用其基类的析构函数。这就是继承与派生,你先去看看书吧

#9


c++ primer plus(第五版)第十三章 类继承
建议您好好研读研读

#10


学妹的东西总是有很多人关注!

#11


我一直以为学妹是指,发帖人的学妹,从来都不帮着看!

#12


学妹的贴很多人回

#13


新手表示压力很大!

#14


基类析构函数也要虚拟,不然析构的时候要出错

#15


学妹,以你现在的C++认知 完全可以去学学VC方面的 MFC相关  向你所写的东西 在MFC中都可以很直观的体现出来 而且可以做的漂漂亮亮的 功能都能做的很全面 基本语法和纯C++类似 很好入门的

#16


引用 2 楼 xph4444 的回复:
引用 1 楼 pathuang68 的回复:

派生类在构造对象时,会先调用其基类的构造函数。在析构对象时,最后会调用其基类的析构函数。在C++的书上,都会说到这个滴,妹妹看书不认真了吧?

要想知道为什么会这样,在坛子里可能很难说清楚。妹妹不妨先记住这个结论,等C++内功提升到了一定层次后,可以自行研习Inside C++ Object Model。


我如果只要调用派生类的构造……

如果这样的派生还能叫做派生吗?

#17


一楼正解。A类如果是B类的派生类,意思就是A类具有B类的所有“属性”,所谓构造函数就是要构造出类的“属性”,你生成A类对象的时候不让调用B类的构造函数,就相当于不让A类的对象具有某些属于B类的“属性”。现实之中可以理解为,男人类是人类的派生类,人类有身高和体重两个“属性”,男人类也继承了这两个“属性”,人类的构造函数其实就是在生成人类对象的时候初始化这两个“属性”(当然也可能有其他动作),如果男人类在生成一个男人对象的时候不调用人类的构造函数,其实就相当于这个男人对象没有初始化这两“属性”。我就是这样理解的,不知道是否恰当,仅供参考。

#18


继承问题。
派生类对象的定义时,要先调用父类的构造函数。

#19


学妹的变量名设置得不好
例如xm,姓名应该用name
yx;这个月薪吗?应该用income

#20


    js(){  char xm1[8];
cout<<"请输入技术部员工的姓名:";
cin>>xm1;
xm=new char[strlen(xm1)+1];
    strcpy(xm,xm1);
sx=200;};//时薪;

为什么要把这些东西写到构造函数里面呢  有违常理  不支持这样做    这些代码完全可以写到另一个函数里来调用  构造的时候就避免了 出现群主的情况。    继承是构造是由上到下的,写多了就会明白的,时间会告诉你的

#21


看到贴后,感到鸭梨很大