Невозможно изменить параметры таким образом, и не должно быть, потому что это, как правило, нарушает принцип подстановки Лискова (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(); }
};