在派生类中调用重写的方法
Calling an overridden method in a derived class
假设我们有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前面通常也是无用的;此外,我看到您将name
和school
声明为指向字符串的指针:在大多数情况下,这是不必要的,也是错误的,因为您放弃了值语义。
相关文章:
- 如何强制从重写方法调用重写的方法基方法?
- 具有引用返回类型的重写方法上的协变返回类型无效
- 调用不是来自直系父亲的重写方法
- Qt/C++ - 从派生类调用重写方法
- 重写方法优先 C++
- 为什么重写方法并将 const 添加到参数类型有效
- 如何在向量上调用不同的重写方法
- 处理C++中基类的重写方法的异常
- C重写C++方法
- 如何自动更新重写方法的 *this 返回类型
- 在 c++ 中具有不同返回类型的重写方法
- 未调用继承的重写方法
- 只有当类重写方法时,在动态加载的共享库中实例化的类才会丢失XCode 4.3/4.4 typeinfo
- 在构造函数中使用重写方法的替代方法,Java
- 使用父类型时重写C++方法
- 多个线程中的重写方法
- 关于在强制转换为子类的超类时调用其重写方法
- 如何在所有派生类中调用重写方法
- 返回对"this"的取消引用的重写方法
- C++-从方法基类调用派生类中的重写方法