我有一个常量重载的访问器成员函数(例如 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 DerivedContainer *
到 BaseContainer *
的 const_cast
是非法的,我不确定这在多态情况下是否有效.
我假设转换仍然有效,因为 this
的类型总是 const BaseContainer *
in BaseContainer::operator[] const
因为它不是虚拟的,但我不确定这是否是正确的方法。也许在这种情况下定义两次 operator[]
会更好?
最佳答案
would assume that the
const_cas
t is still valid because the type of this would always beconst BaseContainer *
inBaseContainer::operator[] const
because it is notvirtual
, but I am not sure if that's the correct way of doing this.
你的理解是正确的。代码应按预期工作。
不过,您还需要考虑另一件事。当你声明
Foo& operator[](int i);
在派生类中,如果在派生类对象/引用/指针上进行函数调用,则不会找到 const
版本。为了能够将它与派生类对象/引用/指针一起使用,请在派生类中添加以下内容。
using BaseContainer::operator[];
关于c++ - Const 重载和多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56762037/