使用static_cast更改派生结构成员

问题描述 投票:0回答:2

对于我的新项目,我想使用以前的代码作为框架,通过避免重写代码来加快原型开发。在下面的代码中,Derived结构属于新项目,它需要定义一个新成员MoreElaborateMember,该成员具有与新项目相关的内容。我想使用基础项目中的功能fooMoreElaborateMember进行更改,但我不能。我如何在不接触基础代码的情况下解决此问题?

#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;
}
c++ inheritance static-cast
2个回答
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;
}

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.