所以我有一个名为人
的课程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
答案 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
。