在派生类中调用重写的方法

Calling an overridden method in a derived class

本文关键字:重写 方法 调用 派生      更新时间:2023-10-16

假设我们有3个类:Person、Student和Worker。学生和工人都来源于人。我想制作一个人员数组,它由随机定位的学生和工人实例组成。Student和Worker中都重载了一个名为show()的方法,我想调用该函数而不是Person show()方法。我知道如何通过像(Student*)或(Worker*)那样强制转换Person对象,我如何在数组中使用该方法?下面是一些示例代码;

类人员:

Person::Person() {    
    this->name = new std::string("Gabi");
    this->age = 12;
}
void Person::show() {   
    std::cout << "Hi my name is " << *(this->name) << std::endl;
    std::cout << "and I am " << this->age << " years old" << std::endl;
}

班级学生:

Student::Student() { 
    this->school = new std::string("ghica");
}
void Student::show() {
    Person::show();
    std::cout << "My school is " << *(this->school) << std::endl;
}

工人阶级:

Worker::Worker() {
    this->workplace = new std::string("google");
}
void Worker::show() { 
    Person::show();
    std::cout << "My workplace is " << *(this->workplace) << std::endl;
}

如果我这样调用show()方法:

Person * myperson = new Student("Andrei", 29, "ghica");
myperson->show();

学校信息不会出现,但如果我这样做:

Person * myperson = new Student("Andrei", 29, "ghica");
((Student*)myperson)->show();

确实如此。有什么想法吗?

重写一个方法不足以通过对基类的指针/引用来调用它。你需要将其虚拟化:

class Person {
public:
  virtual void show() { // Virtual function
      std::cout << "person show";
  }
};
class Worker : public Person {
public:    
  void show() {
      std::cout << "Worker show";
  }
};
int main() {
    Person obj;
    Worker obj2;
    Person* array[2];
    array[0] = &obj;
    array[1] = &obj2;

    array[0]->show(); // Person
    array[1]->show(); // Worker
   return 0;
}

示例

Person类中的show方法声明为virtual

class Person
{
    ....
    virtual void show();
    ....
};

此外,即使与问题无关,将this->放在每个成员变量use前面通常也是无用的;此外,我看到您将nameschool声明为指向字符串的指针:在大多数情况下,这是不必要的,也是错误的,因为您放弃了值语义。