Вызов функции расширенного класса

Итак, у меня есть класс под названием Человек

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

1

Решение

У вас есть массив 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
}
2

Другие решения

Компилятор не знает, что указатель указывает на Patient объект, так что вы должны явно указать компилятору, что это:

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

Либо так, либо сделай setSomething virtual функция в базовом классе.

Небольшое примечание: использование static_cast работает только если вы уверены, что указатель является указателем на Patient объект. Если есть изменение, это не так, то вы должны использовать dynamic_cast и убедитесь, что результат не nullptr,

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector