Это не представляется возможным изменить параметры таким образом, это не должно быть, потому что, как правило, нарушают Лисков принцип замещения (LSP): Aircraft::getImage
может принимать по определению любые GenericImage
, который включает в себя произвольные подклассы GenericImage
. Подкласс должен соответствовать этому интерфейсу и поэтому также должен принимать любые GenericImage
. Однако вы явно хотите указать, что он принимает только конкретный подтип Image
.
Обратите внимание, что ситуация отличается для типов возврата, потому что те представляют собой вещи, функция производит вместо вещей функция принимает (вы можете сказать, ваш getImage
также производит, но C++ не знает понятия параметра out, и вам действительно нужно передать существующий объект getImage
, чтобы заполнить его данными изображения). Поскольку для возвращаемых типов переход к производному типу не нарушает LSP, C++ действительно позволяет его (эта функция называется ковариантными типами возврата). Поэтому решение состоит в том, чтобы выделить объект изображения внутри вашей функции и вернуть его (желательно с помощью указателя), к сожалению, для ковариантных типов возврата нет умного указателя, чтобы указать распределение, которое имеет место). То есть, ваша функция будет читать
class Aircraft
{
virtual GenericImage* getImage() = 0;
};
class Drone: public Aircraft
{
virtual Image* getImate() { return new Image(); }
};
Однако, скорее всего, вы будете использовать только интерфейс базового класса в любом случае, поэтому я предпочел бы просто пойти с GenericImage
в интерфейсе, и вместо того, чтобы воспользоваться преимуществами смарт-указатели :
class Aircraft
{
virtual std::unique_ptr<GenericImage> getImage() = 0;
};
class Drone: public Aircraft
{
virtual std::unique_ptr<GenericImage> getImate() { return new Image(); }
};
Спасибо. Это именно то, что я искал. – imjojo42
@user: Вопрос в том, почему вы действительно хотите использовать производное изображение в производном самолете? Почему бы просто не вернуть «GenericImage» там тоже? – Xeo
Причина этого в том, что каждый самолет имеет другой формат изображения, который он возвращает. Поэтому каждый самолет будет иметь другой формат, характерный для этого самолета, но все самолеты будут иметь изображение. – imjojo42