使用 static_cast 更改派生结构成员
using static_cast to change derived struct member
对于我的新项目,我想使用我以前的代码作为框架,通过避免重写代码来加速原型设计。在下面的代码中,Derived
结构属于新项目,它需要定义一个新成员,MoreElaborateMember
该成员具有与新项目相关的内容。我想使用该功能,foo
从基本项目中对MoreElaborateMember
进行更改,但我不能。如何在不接触基本代码的情况下解决此问题?
#include <cassert>
struct SimpleMember
{
int a;
};
struct MoreElaborateMember: SimpleMember
{
// lots of other stuff
};
struct Base
{
SimpleMember member;
};
struct Derived: Base
{
MoreElaborateMember member;
};
void foo(Base& base)
{
base.member.a = -1;
}
int main()
{
Base base;
Derived derived;
foo(static_cast<Base&>(derived));
assert(derived.member.a == -1);
return 0;
}
您是否考虑过从 SimpleMember 编写 MoreElaborateMember 而不是继承?可能有点样板,但我认为如果我理解正确,它会实现您想要的。
struct SimpleMember
{
int a;
};
struct MoreElaborateMember
{
MoreElaborateMember(SimpleMember& s)
: a(s.a)
{}
int& a;
int b;
};
struct Base
{
SimpleMember member;
};
struct Derived : public Base
{
Derived()
: Base()
, member(Base::member)
{}
MoreElaborateMember member;
};
void foo(Base& base)
{
base.member.a = -1;
}
int main(int, char**)
{
Derived derived;
derived.member.a = 13;
derived.member.b = 42;
assert(derived.member.a == 13);
assert(derived.member.b == 42);
foo(derived);
assert(derived.member.a == -1);
assert(derived.member.b == 42);
return 0;
}
如果你使用多态性,你会更舒服。
#include <cassert>
struct SimpleMember
{
int a;
};
struct MoreElaborateMember : SimpleMember
{
// lots of other stuff
};
struct Base
{
protected:
SimpleMember member;
public:
virtual void set_member(int m) = 0;
};
struct Derived : public Base
{
MoreElaborateMember member;
virtual void set_member(int m)
{
Base::member.a = m;
member.a = m;
}
};
void foo(Base* base)
{
base->set_member(-1);
}
int main()
{
Derived derived;
foo(&derived);
assert(derived.member.a == -1);
return 0;
}
相关文章:
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 有没有办法将C++结构/类中的所有定义都纳入范围而不从中派生?
- 受保护的嵌套结构不能用作派生外部类中的返回类型?
- 基类类型向量中的派生结构
- 使用 static_cast 更改派生结构成员
- C++ 在派生类中访问基的私有结构
- 为什么C++可以使用派生结构来实例化其父模板结构,而父模板可以调用子结构的函数?
- C 结构实现派生接口
- 从派生类重新定义基类中定义的结构
- 具有灵活大小的结构的 MPI 派生数据类型
- 是否可以将基类的结构分配给派生类的结构
- 如何在派生类中初始化继承的模板POD结构
- 是否可以在 c++ 中的派生类中以特定偏移量附加结构
- 在 c++ 的编译时初始化派生结构类型的变量
- Gcc /clang在基结构的后填充中布局派生结构的字段
- 具有模板化基类型的派生结构的结构初始化
- 使用memset对派生结构体进行归零
- 从基创建派生结构
- 派生结构与指向其他结构的结构
- c++将派生结构传递给期望超结构的方法