Полагаю, вы хотите, чтобы вторая версия была:
class Window : public Renderer
, в этом случае память по наследству будет на самом деле больше.Это потому, что когда вы наследуете что-то, класс увеличивается в размере как минимум на sizeof
базовый класс.
Первая версия на самом деле страдает лишь незначительным увеличением размера, так как вы сохраняете ссылку ине фактический объект.Следующее:
class Window
{
public:
Window(Renderer &renderer) : m_renderer(renderer)
{ }
void update()
{
....
m_renderer.draw(this);
}
private:
Renderer m_renderer; //no reference
}
будет занимать больше места.
Более важно , чем что-либо другое, когда выбор между этими двумя значениями не влияет на производительность (различия незначительны, еслина всех), но отношения между двумя.Состав и наследование описывают разные вещи.
Если Window
является Renderer
, используйте наследование.Если Windows
имеет Renderer
, используйте композицию.