0
struct Base
{
  int x;
  int foo() const
  {
    return x;
  }
};

struct Derived : Base
{
  int y;
  int foo() const
  {
    return Base::foo() + y;
  }
};

int main(int argc, char **argv) {
  Derived d;
  d.x = 1;
  d.y = 2;
  const Base& b = d;
  std::cout << b.foo() << std::endl;
  std::cout << d.foo() << std::endl;
  return 0;
}

この設計上の問題があります。コードの一部で直接アクセスされるいくつかのメンバーをラップするために使用される 2 つの単純な構造体 (ベースには、示されているよりも多くのメンバーがあります)。基本クラスには、これらのメンバーを集約する関数があります。派生クラスはさらにいくつかのメンバーを定義し、関数はそれらのメンバーをベースの集約の結果に集約します。集約関数は大きなループで呼び出されるため、仮想関数は望ましくなく、メインに示されている問題を引き起こします。foo が呼び出されると、同じオブジェクトが異なる動作をします (同じオブジェクト ベースと派生バージョンで異なる関数が呼び出されるため)。 . メンバーがコード内で直接アクセスされていない場合に適切なプライベート継承を使用するなど、いくつかの代替案を検討しました。

4

0 に答える 0