1

所以我有一个名为Person的类

class Person{

   private:

   public:
      Person();

}

和另外 1 个名为Patient的类

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();

现在我想像这样从Patient 类调用setSomething函数

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

但我不断收到以下错误:

class Person has no member named setSomething
4

2 回答 2

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
}
于 2013-05-15T10:02:44.787 回答
1

编译器不知道指针指向一个Patient对象,所以你必须明确告诉编译器它是:

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

要么,要么在基类中创建setSomething一个函数。virtual

不过要注意一点:static_cast只有在您确定指针是指向Patient对象的指针时才使用。如果有变化它不是,那么你必须使用dynamic_cast,并检查结果不是nullptr

于 2013-05-15T10:05:04.130 回答