У меня есть функция-член accessor (например, operator[]
), которая перегружена const:
class Container {
public:
Foo& operator[](int i);
const Foo& operator[](int i) const{
return const_cast<Container *>(this)->operator[](i);
}
};
Здесь const Foo& operator[] const
определяется таким образом, чтобы одно и то же не определялось дважды.
Теперь я хочу сделать Container
базовым классом, а operator[]
станет виртуальным:
class BaseContainer {
public:
virtual Foo& operator[](int i) = 0;
const Foo& operator[](int i) const{
// Is this correct?
return const_cast<BaseContainer *>(this)->operator[](i);
}
};
class DerivedContainer : public BaseContainer {
public:
Foo& operator[](int i);
};
Поскольку это незаконно для const_cast
с const DerivedContainer *
до BaseContainer *
, я не уверен, работает ли это в случае полиморфизма.
Я бы предположил, что приведение все еще в силе, потому что тип this
всегда будет const BaseContainer *
в BaseContainer::operator[] const
, потому что он не виртуальный, но я не уверен, что это правильный способ сделать это. Может быть, в этом случае просто лучше определить operator[]
дважды?