вы вводите неопределенное поведение земли.

ак вернулся как раз вовремя.

Я получаю странную ошибку:

 '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 это было брошено.