C 方法没有被覆盖

The C++ method is not getting overridden?

本文关键字:覆盖 方法      更新时间:2023-10-16
class People {
    public:
        People(string name);
        void setName(string name);
        string getName();
        void setAge(int age);
        int getAge();
        virtual void do_work(int x);
        void setScore(double score);
        double getScore();
    protected:
        string name;
        int age;
        double score;
};
class Student: public People {
    public:
        Student(string name);
        virtual void do_work(int x);
};
class Instructor: public People {
    public:
        Instructor(string name);
        virtual void do_work(int x);
};
People::People(string name) {
    this->name = name;
    this->age = rand()%100;
}
void People::setName(string name) {
    this->name = name;
}
string People::getName() {
    return this->name;
}

void People::setAge(int age) {
    this->age = age;
}
int People::getAge() {
    return this->age;
}
void People::setScore(double score) {
    this->score = score;
}
double People::getScore() {
    return this->score;
}
void People::do_work(int x) {
}
Student::Student(string name):People(name){
    this->score = 4 * ( (double)rand() / (double)RAND_MAX );
}
void Student::do_work(int x) {
    srand(x);
    int hours = rand()%13;
    cout << getName() << " did " << hours << " hours of homework" << endl;
}
Instructor::Instructor(string name): People(name) {
   this->score = 5 * ( (double)rand() / (double)RAND_MAX );
}
void Instructor::do_work(int x) {
    srand(x);
    int hours = rand()%13;
    cout << "Instructor " << getName() << " graded papers for " << hours << " hours " << endl;
}
int main() {
    Student student1("Don");
    Instructor instructor1("Mike");
    People t(student1);
    t.do_work(2);
}

为什么do_work类没有被覆盖?有一个人班,讲师和学生班正在继承这些课程。人类班级中有一个虚拟方法,该方法在学生和讲师中实现。但是它没有被覆盖吗?预先感谢!

您需要对对象进行指示或引用以使工作:

Student* student1 = new Student("Don");
Instructor* instructor1 = new Instructor("Mike");
People* t = student1;
t->do_work(2);

,请不要忘记删除分配的内存:

delete student1;
delete instructor1;

这足以使其正常工作,但是为了安全起见和避免记忆泄漏,您可以走:

#include <memory>
...
int main() {
    auto student1 = std::make_unique<Student>("Don");
    auto instructor1 = std::make_unique<Instructor>("Mike");
    People* t = student1.get();
    t->do_work(2);
}

还请考虑在基础类中宣布虚拟破坏者,如果您从人继承并在继承的类中添加成员字段,那将是必须的:

class People {
    public:
        ...
        virtual ~People() {}
    protected:
        ...
}