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

C++ 在派生类中调用重写的方法,c++,inheritance,derived-class,C++,Inheritance,Derived Class,假设我们有三个班:个人、学生和工人。学生和工人都源于人。我想创建一个persons数组,由随机定位的Student和Worker实例组成。在Student和Worker中都有一个名为show()的重载方法,我想调用该函数,而不是Person show()方法。我知道如何通过像(Student*)或(Worker*)这样的Person对象进行强制转换,如何在数组中使用该方法?下面是一些示例代码 班长: Person::Person() { this->name = new s

假设我们有三个班:个人、学生和工人。学生和工人都源于人。我想创建一个persons数组,由随机定位的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;
}
学校信息不会出现,但如果我这样做:

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

是的。有什么想法吗?

Person
类中的
show
方法声明为
virtual

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

此外,即使与问题无关,在每个成员变量使用之前放置
this->
通常也是无用的;此外,我看到您将
名称
学校
声明为字符串指针:在大多数情况下,这是不必要的,也是错误的,因为您正在放弃。

Person
类中的
show
方法声明为
virtual

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

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

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

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;
}
班级人员{
公众:
虚拟void show(){//虚拟函数
std::cout show();//Worker
返回0;
}

重写方法不足以通过基类的指针/引用调用它。您需要将其设置为虚拟的:

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;
}
班级人员{
公众:
虚拟void show(){//虚拟函数
std::cout show();//Worker
返回0;
}

< /p>是您的代码>显示/ <代码>代码>虚拟<代码>?您应该使用一个虚函数来实现代码> >显示> /Calp>。请张贴C++标题或声明。@ angangeARH拼写错误,是的。固定的感谢书,您的<代码>显示< /COD>成员函数<代码>虚拟< /代码>。您应该使用一个虚拟函数来<代码>显示< /Cord>租借也可以C++标题或声明。@ anggARGH拼写错误,是的。固定的感谢秀关于返回类型?返回类型如何?
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;
}