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

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-&gt; 也常常没有用;此外,我看到您将 nameschool 声明为指向字符串的指针:在大多数情况下,这是不必要且错误的,因为您放弃了 value semantic。

【讨论】:

返回类型怎么样?

以上是关于在派生类中调用重写的方法的主要内容,如果未能解决你的问题,请参考以下文章

C# virtual 和 abstract 区别

virtual这个关键字有啥用

C# 中基类,虚类,抽象类,密封类,接口的区别

虚方法抽象方法接口方法

virtualabstractinterface区别以及用法

C# 关键字--virtual(转)