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 が呼び出されると、同じオブジェクトが異なる動作をします (同じオブジェクト ベースと派生バージョンで異なる関数が呼び出されるため)。 . メンバーがコード内で直接アクセスされていない場合に適切なプライベート継承を使用するなど、いくつかの代替案を検討しました。