Итак, у меня есть класс под названием Человек
class Person{
private:
public:
Person();
}
и еще 1 класс называется Пациент
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
У вас есть массив 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
}
Компилятор не знает, что указатель указывает на Patient
объект, так что вы должны явно указать компилятору, что это:
static_cast<Patient*>(ppl[0])->setSomething(...);
Либо так, либо сделай setSomething
virtual
функция в базовом классе.
Небольшое примечание: использование static_cast
работает только если вы уверены, что указатель является указателем на Patient
объект. Если есть изменение, это не так, то вы должны использовать dynamic_cast
и убедитесь, что результат не nullptr
,