简单的关于类的继承与虚函数问题,编译没错,无法运行。求帮

时间:2021-07-08 19:30:03
#include<iostream>
#include<string>   //字符串类使用
using namespace std;

//读者类Reader分为教师,学生,在职研究生三种类型,其中教师可以借书的最大册数为16本,借期最长为270天;
//学生可以借书的最大册数为10本,借期最长为180天。


/*第一组:
1.增加基类Reader的计算超期罚款函数。
2.用基类Reader的指针数组来处理不同派生类对象,从而实现多态性调用。
*/



#define MAX

class Reader
{    public :
           Reader()
   {  
   cout<<"请输入姓名,性别,编号,借书日期年月日,借书数:"<<endl;
cout<<"(教师可以借书的最大册数为16本,借期最长为270天;学生可以借书的最大册数为10本.)"<<endl;
   cin>>name>>sex>>number>>n>>y>>r>>s;

   }


   virtual void Return();

   void show()
   {   
   cout<<"姓名:"<<name<<endl;
       cout<<"性别:"<<sex<<endl;
   cout<<"编号:"<<number<<endl;
   cout<<"借书日期:"<<n<<"年"<<y<<"月"<<r<<"日"<<endl;
   cout<<"借书数:"<<s<<endl;

   }






   protected:
           string name;                            //姓名

           string sex;                             //性别
   
           string number;                          //编号
   
   int n,y,r,s;                            //年 月 日  借书数
};



////////声明Rstudent公有继承Reader
class Rstudent:virtual public Reader
{
     public:
 Rstudent():Reader()
 {    
 cout<<"请输入专业"<<endl;
 cin>>major;

  ++count_s;

 }

 void Return()
 {   int N,Y,R,S,F;
    cout<<"请输入还书时间(年月日)及还书数"<<endl;
cin>>N>>Y>>R>>S;
F=0.5*((N-n)*365+(Y-y)*30+(R-r));
cout<<endl<<"你需要交的罚款金额为"<<F;

             s=s-S;
 }
              

 void show()
 {    
 Reader::show();
 cout<<"专业:"<<major<<endl;
 cout<<"学生读者借期最长为180天"<<endl;
 }
     
 void show_count()
 {
 cout<<"学生读者已有"<<count_s;
 }




 protected:
  
 string major;

 private:


 static int count_s;


};




////////声明Rteacher公有继承Reader
class Rteacher:virtual public Reader
{        
public:
Rteacher():Reader()
{     
cout<<"请输入职位"<<endl;
    cin>>job;

++count_t;


}


void Return()
 {   int N,Y,R,S,F;
    cout<<"请输入还书时间(年月日)及还书数"<<endl;
cin>>N>>Y>>R>>S;
F=1*((N-n)*365+(Y-y)*30+(R-r));
cout<<endl<<"你需要交的罚款金额为"<<F;

             s=s-S;
 }



 void show()
 {    
 Reader::show();
 cout<<"职位:"<<job<<endl;
 cout<<"教师读者最长借期为270天"<<endl;
 }

  void show_count()
 {
 cout<<"教师读者已有"<<count_t;
 }





protected:
 
string job;

private:

 static int count_t;


};







////////声明Gct公有继承Rstudent
class Gct:public Rstudent,public Rteacher
{
       public:
   Gct():Reader(),Rstudent(),Rteacher()
 {   
 ++count_G;
 }



   void Return()
 {   int N,Y,R,S,F;
    cout<<"请输入还书时间(年月日)及还书数"<<endl;
cin>>N>>Y>>R>>S;
F=2*((N-n)*365+(Y-y)*30+(R-r));
cout<<endl<<"你需要交的罚款金额为"<<F;

             s=s-S;
 }

void show()
{
Rstudent::show();
cout<<endl<<"职位:"<<job<<endl;

}

 void show_count()
 {
 cout<<"研究生读者已有"<<count_G;
 }


   private:

 static int count_G;

};






int Rstudent::count_s=0;
int Rteacher::count_t=0;
int Gct::count_G=0;


int main()                      //主函数
{
    Rstudent S1;
Rteacher T1;
Gct G1;
S1.show();
S1.show_count();
cout<<endl;
T1.show();
T1.show_count();
cout<<endl;
G1.show();
G1.show_count();


return 0;

}
   


6 个解决方案

#1


主函数还没完善,没用到指针,就想着前面的代码弄好。

#2


--------------------Configuration: 1 - Win32 Debug--------------------
Linking...
1.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Reader::Return(void)" (?Return@Reader@@UAEXXZ)
Debug/1.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.

1.exe - 1 error(s), 0 warning(s)

#3


virtual void Return() = 0;

你不实现,就要声明它是抽象的

#4


第一次见到这种类派生法的.... virtual是用来修饰虚函数的,不是用来派生类继承的。

------- Quote -------
////////声明Rteacher公有继承Reader
 class Rteacher:virtual public Reader
{

#5


引用 4 楼 imyzcn 的回复:
第一次见到这种类派生法的.... virtual是用来修饰虚函数的,不是用来派生类继承的。

------- Quote -------
////////声明Rteacher公有继承Reader
 class Rteacher:virtual public Reader
{


你别说LZ,那是你自身问题,请搜索“C++ 虚继承”

#6


引用 5 楼 jianwen0529 的回复:
Quote: 引用 4 楼 imyzcn 的回复:

第一次见到这种类派生法的.... virtual是用来修饰虚函数的,不是用来派生类继承的。

------- Quote -------
////////声明Rteacher公有继承Reader
 class Rteacher:virtual public Reader
{


你别说LZ,那是你自身问题,请搜索“C++ 虚继承”


默默地翻开了 C++ Primer 第4版,果然看到了虚继承..... 呵,学艺不精啊。还是3楼比较厉害

#1


主函数还没完善,没用到指针,就想着前面的代码弄好。

#2


--------------------Configuration: 1 - Win32 Debug--------------------
Linking...
1.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Reader::Return(void)" (?Return@Reader@@UAEXXZ)
Debug/1.exe : fatal error LNK1120: 1 unresolved externals
执行 link.exe 时出错.

1.exe - 1 error(s), 0 warning(s)

#3


virtual void Return() = 0;

你不实现,就要声明它是抽象的

#4


第一次见到这种类派生法的.... virtual是用来修饰虚函数的,不是用来派生类继承的。

------- Quote -------
////////声明Rteacher公有继承Reader
 class Rteacher:virtual public Reader
{

#5


引用 4 楼 imyzcn 的回复:
第一次见到这种类派生法的.... virtual是用来修饰虚函数的,不是用来派生类继承的。

------- Quote -------
////////声明Rteacher公有继承Reader
 class Rteacher:virtual public Reader
{


你别说LZ,那是你自身问题,请搜索“C++ 虚继承”

#6


引用 5 楼 jianwen0529 的回复:
Quote: 引用 4 楼 imyzcn 的回复:

第一次见到这种类派生法的.... virtual是用来修饰虚函数的,不是用来派生类继承的。

------- Quote -------
////////声明Rteacher公有继承Reader
 class Rteacher:virtual public Reader
{


你别说LZ,那是你自身问题,请搜索“C++ 虚继承”


默默地翻开了 C++ Primer 第4版,果然看到了虚继承..... 呵,学艺不精啊。还是3楼比较厉害