gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:51:15 25 4
gpt4 key购买 nike

假设我们有 3 个类:Person、Student 和 Worker。 Student 和 Worker 都派生自 Person。我想制作一组人,其中包括随机放置的 Student 和 Worker 实例。在 Student 和 Worker 中都有一个名为 show() 的方法重载,我想调用该函数而不是 Person show() 方法。我知道如何通过将 Person 对象转换为 (Student*) 或 (Worker*) 来实现我如何在数组中使用该方法?下面是一些示例代码;

人类:

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;
}

类(class)学生:

Student::Student() { 
this->school = new std::string("ghica");
}

void Student::show() {

Person::show();
std::cout << "My school is " << *(this->school) << std::endl;
}

类 worker :

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;
}

Example

关于c++ - 在派生类中调用重写的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26335364/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com