У меня есть следующий код:
#include <iostream>
using namespace std;
class Child1
{
int i;
};
class Child2 : public Child1
{
int j;
};
class Base1
{
public:
virtual Child1& getChildren()
{
cout << "Children1" << endl;
return children;
}
private:
Child1 children;
};
class Base2 : public Base1
{
public:
virtual Child2& getChildren()
{
cout << "Children2" << endl;
return children;
}
private:
Child2 children;
};
Этот код компилируется нормально, но когда я меняю тип возврата getChildren()
с ссылочного типа на тип объекта в одном или обоих Base1
и Base2
(например, virtual Child2 getChildren()
, я получаю следующую ошибку в Visual Studio 2010 :
error C2555: 'Base2::getChildren': overriding virtual function return type differs and is not covariant from 'Base1::getChildren'
Я хочу знать, почему я не получаю эту ошибку при использовании ссылки и получаю ее в противном случае. Это ошибка в VS2010? Поскольку стандарт C ++ (согласно этой странице на веб-сайте Microsoft) говорит что-то вроде: Возвращаемый тип переопределяющей функции должен быть либо идентичным возвращаемому типу переопределенной функции, либо ковариантно с классами. функций. И класс в типе возврата B :: f является тем же классом, что и класс в типе возврата D :: f или, является однозначным прямым или косвенным базовым классом класс в возвращаемом типе D :: f и доступен в D.
P.S. У меня нет доступа к стандарту на данный момент, поэтому я не могу подтвердить приведенную выше цитату.