вы вводите неопределенное поведение земли.
ак вернулся как раз вовремя.
Я получаю странную ошибку:
'B::blah': overriding virtual function return type differs and is not covariant from 'A::blah'
Вот код, вызывающий проблему:
class A {
public:
class Inner { };
virtual Inner blah() = 0;
};
class B : public A {
public:
class Inner2 : public Inner { };
Inner2 blah() {
return Inner2();
}
};
Я посмотрел на ошибку, и в соответствии сстраницу, которую я нашел на сайте Microsoftодин из способов может быть ковариантным, если:
класс в возвращаемом типе B :: f является тем же классом, что и класс в возвращаемом типе D :: f или, является однозначным прямым или косвенным базовым классом класса в возвращаемом типе D :: f и доступен в D
Разве это не так сInner
а такжеInner2
? Я использую Microsoft Visual C ++ 2010, если это имеет значение.
Итак, благодаря Джону я узнал, что только указатели и ссылки могут быть ковариантными. Почему это? Производное может быть приведено к Base, так почему бы виртуальным функциям с возвращаемыми типами, производными от одного и того же, просто привести тип возвращаемого типа к базовому классу? В моем примере кажется, что имеет смысл иметь(A*(new B))->blah()
вернутьInner
это действительноInner2
это было брошено.