是否可以派生使父成员可变
Is it possible to derive making the parent members mutable?
出于好奇,
是否可以派生使父成员mutable
?有没有合理的方法来修改下面的代码并使其编译?(保持foo()
const
方法,在父类A
中声明时int a
不mutable
)
class A {
protected:
int a;
};
class B : public A {
public:
void foo() const {
a = 10;
}
};
通常,需要修改const
值意味着您在其他地方有一个需要修复的设计错误......但是,如果您确实需要,则可以使用const演员表来执行此操作;例如
const_cast<int&>(a) = 10;
鉴于你说你想将基类本身视为可变的,你可以考虑在其他地方抛弃恒常性,例如通过创建一个成员函数
A& hack() const { return const_cast<B&>(*this); }
然后你可以实现foo
为
hack().a = 10;
此解决方案的缺点是将const_cast
隐藏在函数调用后面,因此您需要某种方法来确保阅读您的代码的人知道您正在做一些"邪恶"的事情(例如,通过为函数选择的名称)。但是,此版本具有一些优点:
- 在我看来,代码更具可读性
- 它不需要您重复要执行此操作的对象的类型
- 它确保您只对
A
的成员执行此操作,而不是对B
的成员执行此操作。
据
我所知,你不能。这类似于你是否可以从"const"基派生的问题,这更有可能被允许。
原则上这是可能的,但它会产生很多惊喜:例如,这是否意味着您可以将B
常量引用传递给采用A
非常量引用的函数?
其他人说,使a
成员在基中可变可以解决问题,但更接近您的问题的解决方案是使用组合而不是继承,如下所示:
struct B{
mutable A m_a;
void foo() const {m_a.a = 10;}
};
如果需要(有限形式的)多态性,可以添加operator A&() const{return m_a;}
。(也可能有令人惊讶的行为)。
它不是100%等同于假设的可变继承,但它甚至可能更可取。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何使用基类指针引用派生类成员
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 在 C++ 中用派生类型重写成员函数
- 从模板化父类中的派生内部类访问受保护的成员变量
- 将对象强制转换为派生类以访问父类的受保护成员
- 如何将派生类作为函数参数传递:如果派生类成员不在父类中怎么办
- 使父类成员对每个派生类不可修改
- 通过父类型的指针或直接从派生类访问成员函数的差异
- 是否可以派生使父成员可变
- C++子级在复制构造函数和输出之间的某个时间点更改父成员
- 从具有相同虚拟函数的父函数派生时如何调用子函数
- 如何从同一个父级派生多个进程
- 如何在私有继承中调用父成员
- 使用派生类中的成员初始化父类中的std::函数
- 从子类的子类访问父成员
- 子类中的成员是对父成员的引用
- 使用派生类成员初始化父类
- 如何在c++中创建继承结构时设置父成员