【发布时间】:2019-11-07 18:19:57
【问题描述】:
我有一个常量重载的访问器成员函数(例如operator[]):
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 的类型在BaseContainer::operator[] const 中始终是const BaseContainer *,因为它不是虚拟的,但我不确定这是否是正确的做法。也许在这种情况下定义operator[] 两次更好?
【问题讨论】:
-
// Is this correct?- 没有。试试这个:const DerivedContainer dc; Foo& f = dc[42];。看到问题了吗?进一步:除非你能保证 originating 对象的引用 `const_cast` 正在剥离 const-ness,否则实际上在开始时是非 const,否则你就是在玩火。
标签: c++ polymorphism overloading return-by-reference