.. ot-topic:: cxx11.embedded_problems.virtual_vs_nonvirtual
   :dependencies: cxx11.miscellaneous.variant, cxx03.inheritance_oo.interface

.. include:: <mmlalias.txt>


Replacing ``virtual`` With ``std::variant<>`` (In Real Life)
============================================================

.. sidebar::

   **See also**

   * :doc:`/trainings/material/soup/cxx03/100-inheritance-oo-design/group`
   * :doc:`/trainings/material/soup/cxx11/100-miscellaneous/any-variant-optional/variant`

.. contents::
   :local:

Classic OO Design
-----------------

Source Hierarchy
................

.. literalinclude:: /trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-virtual/toolcase/source.h
   :caption: :download:`Interface: source.h
             </trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-virtual/toolcase/source.h>`
   :language: c++

.. literalinclude:: /trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-virtual/toolcase/source-copyable.h
   :caption: :download:`Implementation: source-copyable.h
	     </trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-virtual/toolcase/source-copyable.h>`
   :language: c++

.. literalinclude:: /trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-virtual/toolcase/source-movable.h
   :caption: :download:`Implementation: source-movable.h
             </trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-virtual/toolcase/source-movable.h>`
   :language: c++

Sink Hierarchy
..............

.. literalinclude:: /trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-virtual/toolcase/sink.h
   :caption: :download:`Interface: sink.h
	     </trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-virtual/toolcase/sink.h>`
   :language: c++

.. literalinclude:: /trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-virtual/toolcase/sink-copyable.h
   :caption: :download:`Implementation: sink-copyable.h
	     </trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-virtual/toolcase/sink-copyable.h>`
   :language: c++

.. literalinclude:: /trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-virtual/toolcase/sink-movable.h
   :caption: :download:`Implementation: sink-movable.h
	     </trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-virtual/toolcase/sink-movable.h>`
   :language: c++

Loop In The Middle
..................

.. literalinclude:: /trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-virtual/toolcase/loop.h
   :caption: :download:`loop.h
	     </trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-virtual/toolcase/loop.h>`
   :language: c++

Omitting ``virtual``: Cram All Alternatives Into ``std::variant<>``
-------------------------------------------------------------------

Source Non-Hierarchy
....................

.. literalinclude:: /trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-nonvirtual/source.h
   :caption: :download:`Non-Interface: source.h
             </trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-nonvirtual/source.h>`
   :language: c++

.. literalinclude:: /trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-nonvirtual/source-a.h
   :caption: :download:`Implementation: source-a.h
	     </trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-nonvirtual/source-a.h>`
   :language: c++

.. literalinclude:: /trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-nonvirtual/source-b.h
   :caption: :download:`Implementation: source-b.h
             </trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-nonvirtual/source-b.h>`
   :language: c++

Sink Non-Hierarchy
..................

.. literalinclude:: /trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-nonvirtual/sink.h
   :caption: :download:`Non-Interface: sink.h
	     </trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-nonvirtual/sink.h>`
   :language: c++

.. literalinclude:: /trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-nonvirtual/sink-1.h
   :caption: :download:`Implementation: sink-1.h
	     </trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-nonvirtual/sink-1.h>`
   :language: c++

.. literalinclude:: /trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-nonvirtual/sink-2.h
   :caption: :download:`Implementation: sink-2.h
	     </trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-nonvirtual/sink-2.h>`
   :language: c++

Loop In The Middle
..................

.. literalinclude:: /trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-nonvirtual/loop.h
   :caption: :download:`loop.h
	     </trainings/material/soup/cxx-code/embedded-virtual-or-not/embedded-nonvirtual/loop.h>`
   :language: c++