В C ++ допустимо уменьшить квалификатор cv возвращаемого типа в производном классе:
class Base {
virtual const Base* f();
};
class Derived : public Base {
Base* f() override;
};
Это действительно с указателями на примитивные типы?
class Base {
virtual const int* f();
};
class Derived : public Base {
int* f() override;
};
Применяются ли ковариантные cv-квалификаторы к примитивным типам в C ++?
НЕТ
§ 10.3.7 Виртуальные функции
Тип возврата переопределяемой функции должен быть либо идентичным типу возврата переопределенной функции, либо ковариантным по отношению к классам функций. Если функция
D::f
переопределяет функциюB::f
, типы возвращаемых функций ковариантны, если они удовлетворяют следующим критериям:
- оба являются указателями на классы, оба являются lvalue ссылками на
классы, или оба являются rvalue ссылками на классы- класс в возвращаемом типе
B::f
тот же класс, что и класс
в возвращаемом типеD::f
, или является однозначным и доступным
прямой или косвенный базовый класс класса в типе возвратаD::f
- оба указателя или ссылки имеют одинаковую квалификацию cv и
тип класса в возвращаемом типеD::f
Других решений пока нет …