Следующий код включает в себя 4 класса.Виртуальный деструктор Не вызывается в базе, а также в производном классе
Основой класса является класс Person и существуют два класса Derived Student и Lecturer. Каждый человек поддерживает две функции: toString() и type(). Тип() возвращает имя этого класса, тогда как toString() печатает информацию экземпляра (Student или Lecturer).
Лицо является абстрактным классом, но оба ученика и лектора являются конкретными классами.
Я реализовал две вышеуказанные функции.
- Многие лекторы разделяют указатель на ту же самую зарплату, что могут быть и другие SalaryTables (поддерживающие ту же функциональность) и что лекторы не владеют SalaryTable. Кроме того, каждый из них имеет некоторые дополнительные функции.
Может ли кто-нибудь объяснить мне третий пункт в одиночку? Насколько я знаю, я использовал указатель SalaryTable, указанный в конструкторе лектора, и назначил его указателю SalaryTable (payTable_), который я добавил в Lecturer.h. Затем я возвращаю зарплату, используя payTable _-> annualSalary (grade_). И в деструкторе ~ Lectuere() я удаляю payTable_.
Это правильный способ сделать это? Когда я это делаю, вызывается только деструктор ~ Salary(), и деструктор класса Base (~ Person()) и деструкторы производного класса (~ Student() & ~ Lecturer()) не вызываются. Может ли кто-нибудь объяснить мне, где я ошибаюсь?
main.cpp
int main(int argc, char* argv[]) {
if (argc == 1) {
SalaryTable st;
Person* arr[2];
arr[0] = new Student("Apolo",5);
arr[1] = new Lecturer("Zeus","CO7100",33,&st);
for (unsigned int i=0 ; i<2 ; ++i) {
if (arr[i]->type() == "Student") {
Student* s=dynamic_cast<Student*>(arr[i]);
s->addMCF("blah blah");
s->addMCF("");
s->addMCF("Something else");
}
}
for (unsigned int i=0 ; i<2 ; ++i) {
cout << *arr[i] << endl;
}
}
}
SalaryTable.h
#ifndef SALARYTABLE_H_
#define SALARYTABLE_H_
class SalaryTable {
public:
SalaryTable();
~SalaryTable();
unsigned int annualSalary(unsigned int grade) const;
};
#endif /* SALARYTABLE_H_ */
Person.h
#ifndef PERSON_H_
#define PERSON_H_
#include <string>
#include <iosfwd>
#include <vector>
#include "SalaryTable.h"
using std::vector;
using std::string;
class Person {
public:
Person() = delete;
Person(const Person&) = delete;
Person(Person&&) = delete;
Person(const char* name);
Person(const std::string& name);
virtual ~Person();
// Return the name of the Person
// Should be supported by all Persons.
std::string name() const;
virtual std::string toString() const=0;
virtual std::string type() const=0;
friend std::ostream& operator<<(std::ostream&, const Person&);
private:
std::string name_;
};
Student.h
class Student: public Person {
public:
Student() = delete;
Student(const Student&) = delete;
Student(Student&&) = delete;
Student(const char* name, unsigned int studentId);
Student(const std::string& name, unsigned int studentId);
virtual ~Student();
void addMCF(const std::string&);
std::string MCF(unsigned int);
unsigned int id() const;
std::string toString() const;
std::string type() const;
private:
unsigned int studentId_;
vector<string> vec_;
};
Lecturer.h
class Lecturer: public Person {
public:
Lecturer() = delete;
Lecturer(const Lecturer&) = delete;
Lecturer(Lecturer&&) = delete;
Lecturer(const char* name, const char* teaches, unsigned int grade,
SalaryTable*);
Lecturer(const std::string& name, const std::string& teaches,
unsigned int grade, SalaryTable*);
virtual ~Lecturer();
void increaseGrade();
unsigned int salary() const;
void changeModule(const std::string& newModule);
std::string teaches() const;
std::string toString() const;
std::string type() const;
private:
string teaches_;
string module_;
unsigned int grade_;
SalaryTable& salaryTable_;
};
#endif /* PERSON_H_ */
Примечание: Разновидность примечание, я не могу вносить изменения в заголовочных файлах.
Я получил много мнений за уничтожение указателя. Но мой последний вопрос: почему все другие классы, кроме класса SalaryTable, не уничтожаются. Я проверил его, напечатав stmt в деструкторе всех классов. Может кто-нибудь пролить свет на него.
«Добавлен файл main.cpp, и я тоже не могу его изменить».
где код с проблемой? почему вы думаете, что мы телепатичны? –
Название вопроса может быть немного вводить в заблуждение. Я полагаю, что реальный вопрос связан с управлением собственностью «Заработной платы» в каждом «Преподавателе». –
Поскольку класс 'Lecturer' не имеет указателя на' SalaryTable', он должен _not_ удалить его. –