使用 static_cast 更改派生结构成员

using static_cast to change derived struct member

本文关键字:派生 结构 成员 static cast 使用      更新时间:2023-10-16

对于我的新项目,我想使用我以前的代码作为框架,通过避免重写代码来加速原型设计。在下面的代码中,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;
}