在派生类中调用重写的方法
Posted
技术标签:
【中文标题】在派生类中调用重写的方法【英文标题】:Calling an overridden method in a derived class 【发布时间】:2014-10-13 08:03:16 【问题描述】:假设我们有 3 个类:Person、Student 和 Worker。 Student 和 Worker 都派生自 Person。我想制作一组人,其中包括随机定位的学生和工人实例。在 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();
确实如此。有什么想法吗?
【问题讨论】:
是你的show
成员函数virtual
?
你应该为show
使用一个虚函数
请同时发布 C++ 标头或声明。
@Angew Argh 拼写错误,是的,没错。固定感谢
【参考方案1】:
重写方法不足以通过基类的指针/引用调用它。您需要将其设为虚拟:
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
【讨论】:
【参考方案2】:将Person
类中的show
方法声明为virtual
:
class Person
....
virtual void show();
....
;
另外,即使与问题无关,在每个成员变量 use 的前面加上this->
也常常没有用;此外,我看到您将 name
和 school
声明为指向字符串的指针:在大多数情况下,这是不必要且错误的,因为您放弃了 value semantic。
【讨论】:
返回类型怎么样?以上是关于在派生类中调用重写的方法的主要内容,如果未能解决你的问题,请参考以下文章