调用扩展类函数

时间:2013-05-15 09:56:42

标签: c++ class oop function derived

所以我有一个名为

的课程
class Person{

   private:

   public:
      Person();

}

还有一个名为患者

的课程
class Patient : public Person{

    private:
       string text_;
    public:
       Patient();
       void setSomething(string text){ text_ = text; }
}

现在我创建了一个包含5个人的数组

Person *ppl[5];

并在数组的每个键中添加了5个患者,如

ppl[0] = new Patient();
ppl[1] = new Patient();
ppl[2] = new Patient();
ppl[3] = new Patient();
ppl[4] = new Patient();

现在我想从患者类中调用 setSomething 功能

ppl[0]->setSomething("test text");

但我一直收到以下错误:

class Person has no member named setSomething

2 个答案:

答案 0 :(得分:2)

您有一个Person*数组。您只能在该数组的元素上调用Person的公共方法,即使它们指向Patient个对象。为了能够调用Patient方法,您首先必须将Person*转换为Patient*

Person* person = new Patient;
person->setSomething("foo"); // ERROR!

Patient* patient = dynamic_cast<Patient*>(person);
if (patient)
{
  patient->setSomething("foo");
} else
{
  // Failed to cast. Pointee must not be a Patient
}

答案 1 :(得分:1)

编译器不知道指针指向Patient对象,因此您必须明确告诉编译器它是:

static_cast<Patient*>(ppl[0])->setSomething(...);

或者在基类中使setSomething成为virtual函数。

尽管如此:只有当您确定指针是指向static_cast对象的指针时,才使用Patient。如果有变化则不然,那么您必须改为使用dynamic_cast,并检查结果是否为nullptr