c++ - Const 重载和多态性

标签 c++ polymorphism overloading return-by-reference

我有一个常量重载的访问器成员函数(例如 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_cast is still valid because the type of this would always be const BaseContainer * in BaseContainer::operator[] const because it is not virtual, 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/

相关文章:

c++ - 如何从 unsigned char * 模数和指数 65537(RSA_F4) 创建 RSA 公钥

C#:派生类上具有不同返回类型的属性

c++ - 基于模板参数在 C++ 中模拟动态调度

c++ - 声明一个没有内容的函数; - 然后是内容 {} - C++

java - Java 中的部分重写(或重载时的动态重写)

c++ - 我收到一个看起来应该是 "just work."的程序的奇怪错误

c++ - 在文件之间共享运行时变量

C++ 多态性 : Does a virtual function in derived class needs to be declared constant if its declared constant in base class

C++ 用非静态函数重载静态函数

c++ - 有没有办法在 Linux 中扫描构​​建的 ARM 库中的函数?