Прежде всего, посмотрите на этот синтаксис:
fruit func() override { return Orange(); }
Что такое override
? В C ++ 03 такого ключевого слова нет. Это только в C ++ 11. Поэтому убедитесь, что вы используете компилятор, который знает об этом ключевом слове.
Во-вторых, в производном классе fruit
действительно Orange
. Переопределение typedef не является проблемой. Проблема в том, что Orange
и Apple
не являются ковариантными типами. Производные друг от друга сделают их ковариантными. В вашем случае вы должны извлечь Orange
из Apple
, чтобы заставить его работать.
Обратите внимание, что вы должны изменить тип возврата с fruit
на fruit*
или fruit&
.
class Orange : public Apple {}; //correct - your code will work
class Apple : public Orange {}; //incorrect - your code will not work
Идея состоит в том, что в базовом классе тип возвращаемого значения должен быть указатель / ссылка базового типа (который равен Apple
), а в производном классе тип возвращаемого значения может быть указатель / ссылка типа Apple
или любого класса, производного от него.
Кстати, это имеет смысл? Вывести Orange
из Apple
?
Как насчет следующего класс-дизайна?
class Fruit {};
class Apple : public Fruit {};
class Orange : public Fruit {};
class Base
{
virtual Fruit* f();
};
class Derived : public Base
{
virtual Fruit* f();
};
Не нужно использовать typedef
.