是否有可能派生使父成员可变?

Ant*_*nio 5 c++ inheritance mutable

出于好奇,

是否有可能派生出父成员mutable?有没有合理的方法修改以下代码并使其编译?(保留foo()方法constint a不是mutable在父类中声明时保留方法A

class A {
protected:
    int a;
};

class B : public A {
public:
    void foo() const {
        a = 10;
    }
};
Run Code Online (Sandbox Code Playgroud)

小智 6

通常,需要修改一个const值意味着您在其他地方存在需要修复的设计错误......但如果您确实需要,您可以通过 const 强制转换来实现;例如

const_cast<int&>(a) = 10;
Run Code Online (Sandbox Code Playgroud)

鉴于您说您希望将基类本身视为可变的,您可能会考虑在其他地方放弃常量,例如通过创建成员函数

A& hack() const { return const_cast<B&>(*this); }
Run Code Online (Sandbox Code Playgroud)

然后你可以实施foo

hack().a = 10;
Run Code Online (Sandbox Code Playgroud)

该解决方案的缺点是隐藏了const_cast函数调用的背后,因此您需要某种方法来确保阅读您代码的人知道您正在做一些“邪恶”的事情(例如,通过精心选择的函数名称)。然而,这个版本有一些优点:

  • 在我看来,代码更具可读性
  • 它不需要您重复正在执行此操作的对象的类型
  • 它确保您对 的成员执行此操作A,而不是对 的成员执行此操作B