c++ - 无法在新运算符处产生错误的类之间建立多态性
问题描述
我正在编写一个大学管理系统,我总共有十个类。众所周知,当我们在基类中使用虚函数时,我们在类之间建立了多态,然后我们从基类继承派生类,并在派生类中重写虚函数但是在这里我遇到了一个我从未遇到过的问题,因为我已经在 C++ 中多次实现了多态,但是现在当我写这个语句并且错误出现在 new 关键字时它给出了错误。它可以在显示类中看到
//Using Polymorphism
Department* department=new Faculties();
我无法在这些部门和院系类之间建立多态性。类似地,有一个从部门派生的员工类,同样的错误在那里我很困惑,因为我仍然是 OOP 的初学者。部门班
#pragma once
#include"Accounts.h"
#include"Faculties.h"
#include"Employee.h"
#include<iostream>
#include<vector>
using namespace std;
#include<string>
class Department
{
public:
Department()=default;
~Department()=default;
//Declaring the methods
//Setters
void setDepartmentID(int);
void setDepartmentStrength(int);
void setHODName(string);
//Inheriting
virtual void setName(string);
virtual void set_id(int);
virtual void set_address(string);
virtual void setEmail(string);
//Defining getters
virtual string getName(int);
virtual int get_id(int);
virtual string get_address(int);
virtual string getEmail(int);
//for calculating payments
virtual void set_payments(float, string, float)=0;
virtual void showPaymentDetails(int);
//getters
int getDepartmentStrength();
private:
vector<string> departmentName;
vector<string> departmentHOD;
vector<int> departmentID;
vector<int> departmentStrength;
//Declaring an array to enter the department faculties
};
Department::Department()
{
}
Department::~Department()
{
}
void Department::setDepartmentID(int id)
{
departmentID.push_back(id);
}
void Department::setName(string name)
{
departmentName.push_back(name);
}
void Department::setDepartmentStrength(int strength)
{
departmentStrength.push_back(strength);
}
void Department::setHODName(string name)
{
departmentHOD.push_back(name);
}
int Department::getDepartmentStrength()
{
static int sum = 0;
for (size_t i = 0; i < departmentStrength.size(); i++)
{
sum = sum + departmentStrength[i];
}
return sum;
}
学科班
#pragma once
#include"Accounts.h"
#include"Department.h"
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Faculties:public Department
{
public:
Faculties()=default;
~Faculties()=default;
//////////////////////////////////Using Polymorphism///////////////////////////////////
//Setters
void setName(string) override;
void set_id(int) override;
void set_address(string) override;
void setEmail(string) override;
void set_payments(float, string, float);
//Getters
string getName(int) override;
int get_id(int) override;
string getEmail(int) override;
string get_address(int) override;
//for showing payments
void showPaymentDetails(int) override;
private:
vector<int> faculty_id;
vector<string> faculty_name;
vector<string> faculty_email;
vector<string> faculty_address;
vector<string> faculty_type;
vector<string> faculty_description;
Accounts accounts;
};
Faculties::Faculties()
{
}
Faculties::~Faculties()
{
}
void Faculties::set_id(int id)
{
this->faculty_id.push_back(id);
}
void Faculties::setEmail(string email)
{
this->faculty_email.push_back(email);
}
void Faculties::setName(string name)
{
this->faculty_name.push_back(name);
}
void Faculties::set_address(string saddress)
{
this->faculty_address.push_back(saddress);
}
string Faculties::getName(int index)
{
return this->faculty_name[index];
}
int Faculties::get_id(int index)
{
return this->faculty_id[index];
}
string Faculties::getEmail(int index)
{
return this->faculty_email[index];
}
string Faculties::get_address(int index)
{
return this->faculty_address[index];
}
void Faculties::set_payments(float decidedSalary, string payment_method, float total_working_hours)
{
//Using composition
accounts.set_decided_salary(decidedSalary);
accounts.set_payment_method(payment_method);
accounts.set_total_working_hours(total_working_hours);
}
void Faculties::showPaymentDetails(int index)
{
cout << "\nThe decided salaray of faculty with name " << faculty_name[index] << " is " <<
accounts.get_decided_salary(index);
cout << "\nThe payment method of faculty with name " << faculty_name[index] << " is " <<
accounts.get_payment_method(index);
cout << "\nThe deducted salary of faculty with name " << faculty_name[index] << " is " <<
accounts.get_deducted_salary(index);
cout << "\nThe paid salary of faculty with name " << faculty_name[index] << " is " <<
accounts.get_paid_salary(index);
cout << "\nThe bonus salary paid of faculty with name " << faculty_name[index] << " is " <<
accounts.get_bonus_salary(index);
}
显示类在这里它给出错误并且在 source.cpp 中相同
#pragma once
#include"Department.h"
#include"Student.h"
#include"Courses.h"
#include"SubCampuses.h"
#include"Faculties.h"
#include"Employee.h"
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Display
{
public:
Display()=default;
~Display()=default;
void setStudentsData(string, int, string)
{
}
void setStudentsData(string name, int id, string address, string email, int departmentID, int departmentStrength, string HODname);
void setStudentsAcademicRecord(float marks, char grades, float attandancePercentage, float CGPA);
void setStudentCourseInfo(Courses courses, string coursesEnrolled, float courseWiseAttandancePercentage, float courseWiseMarks);
//Setting the faculties of students
void setFacultiesInfo(string name,int id,string address,string email, float decidedSalary, string payment_method, float total_working_hours);
//setting the employees info
//void setEmployeesInfo(string name, int id, string address, string email, float decidedSalary, string payment_method, float total_working_hours);
void ShowStudentCoursesInfo();
void ShowStudentRecord(int);
void ShowFacultiesDetails(int);
//void ShowEmployeesDetails(int);
private:
//Using Inheritance
Student *student;
Courses courses;
Faculties faculties;
//Using Polymorphism
Department* department=new Faculties(); ///////////////////Here is the error ////////////////////////
};
Display::Display()
{
}
Display::~Display()
{
}
void Display::setStudentsAcademicRecord(float marks, char grades, float attandancePercentage, float CGPA)
{
student->set_student_marks(marks);
student->set_student_grades(grades);
student->set_Attandance_percentage(attandancePercentage);
student->set_GCPA(CGPA);
}
void Display::setStudentsData(string name, int id, string address, string email,int departmentID,int departmentStrength,string HODname)
{
student->setName(name);
student->set_id(id);
student->set_address(address);
student->setEmail(email);
}
void Display::ShowStudentRecord(int id)
{
cout<<"\nThe name of student is equal to "<<student->getName(id);
cout << "\nThe Id of student is equal to " << student->get_id(id);
cout << "\nThe Email of student is equal to " << student->getEmail(id);
cout << "\nThe Adress of student is equal to " << student->get_address(id);
//Now showing the student academic records
student->ShowStudentAcademicRecord(id);
}
void Display::setStudentCourseInfo(Courses courses, string coursesEnrolled, float courseWiseAttandancePercentage, float courseWiseMarks)
{
courses.set_courses_enrolled(coursesEnrolled);
courses.set_coursewise_attendance_percentage(courseWiseAttandancePercentage);
courses.set_course_wise_marks(courseWiseMarks);
}
void Display::ShowStudentCoursesInfo()
{
//Passing the courses object to the courses info
student->ShowStudentCoursesInfo(courses);
}
void Display::setFacultiesInfo(string name, int id, string address, string email, float decidedSalary, string payment_method, float total_working_hours)
{
department->setName(name);
department->set_id(id);
department->set_address(address);
department->setEmail(email);
department->set_payments(decidedSalary, payment_method, total_working_hours);
}
void Display::ShowFacultiesDetails(int id)
{
cout<<"\nThe id of department faculty is "<<department->get_id(id);
cout << "\nThe Name of department faculty is " << department->getName(id);
cout << "\nThe Email of department faculty is " << department->getEmail(id);
cout << "\nThe Address of department faculty is " << department->get_address(id);
cout << "\nThe Department faculty strength is " << department->getDepartmentStrength();
}
错误截图如下 错误图片 完整程序在以下链接 https://github.com/Muhammad-Bilal-7896/Univeristy-Management-System
解决方案
正如评论中包含的@1201ProgramAlarm 一样,您包含循环包含,这可能会让编译器感到烦恼,并且程序无法编译,因此请删除那些不必要的头文件。同时将destructor 设为department 类的虚拟。确保只有析构函数是虚拟的而不是构造函数。