{"id":3443,"date":"2026-01-30T05:16:00","date_gmt":"2026-01-30T04:16:00","guid":{"rendered":"https:\/\/kunden.weissblaumedia.de\/microconsult\/2023\/02\/28\/tb_polymorphie\/"},"modified":"2026-06-17T13:15:52","modified_gmt":"2026-06-17T11:15:52","slug":"tb_polymorphy","status":"publish","type":"post","link":"https:\/\/www.microconsult.de\/en\/tb_polymorphie\/","title":{"rendered":"C++ Programming: Dynamic or Static Polymorphism?"},"content":{"rendered":"<p><strong>Mit steigender Komplexit\u00e4t von Embedded-Software erlangt die Erf\u00fcllung von Qualit\u00e4tsmerkmalen, wie \u00c4nderbarkeit, Erweiterbarkeit, Anpassbarkeit und Wiederverwendbarkeit, eine immer gr\u00f6\u00dfere Bedeutung. Ein wichtiges Mittel, um diese Software-Qualit\u00e4tsanforderungen zu erf\u00fcllen, ist die Anwendung von polymorphen Strukturen in der Architektur, im Design und in der Implementierung. Die Softwareentwicklung unterscheidet dynamische und statische Polymorphie.\u00a0<\/strong><\/p>\n<p><!--more--><\/p>\n<p>Dieser Beitrag\u00a0erkl\u00e4rt die dynamische und statische Polymorphie und zeigt deren Anwendung an einem einfachen Fallbeispiel. Ein Ergebnisvergleich erfolgt anhand von drei verschiedenen Design- und Implementierungsans\u00e4tzen. Um diesen Beitrag vollst\u00e4ndig zu verstehen, sind Kenntnisse der <a href=\"https:\/\/www.uml.org\/\" target=\"_blank\" rel=\"noopener\">UML<\/a>, der objektorientierten Programmierung und der Programmiersprache C++ vorausgesetzt.<\/p>\n<h4>Polymorphismus<\/h4>\n<p>Im Kontext der Software-Entwicklung bedeutet Polymorphie die Vielgestaltigkeit von Funktionen, also Funktionen mit gleicher Semantik und Aufruf bei unterschiedlichen Implementierungen.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2276 size-medium\" src=\"https:\/\/www.microconsult.de\/blog\/wp-content\/uploads\/2023\/02\/Polymorphismus_Bild1b-300x143.png\" alt=\"Polymorphie bei Klassen-Funktionen\" width=\"300\" height=\"143\" data-wp-pid=\"2276\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2275 size-medium\" src=\"https:\/\/www.microconsult.de\/blog\/wp-content\/uploads\/2023\/02\/Polymorphismus_Bild1a-300x143.png\" alt=\"Polymorphie bei Klassen-Funktionen\" width=\"300\" height=\"143\" data-wp-pid=\"2275\" \/><\/p>\n<p><em>Bild 1: Polymorphie bei Klassen-Funktionen<\/em><\/p>\n<p>Im Kontext der objektorientierten Software-Entwicklung bezieht sich Polymorphie auf Klassen-Funktionen. Mehrere Klassen enthalten eine oder mehrere semantisch identische, aber klassenspezifisch unterschiedlich implementierte Funktionen.<\/p>\n<p>Der Aufruf der unterschiedlich implementierten Funktionen erfolgt dennoch gleichartig. Somit ergeben sich bei einem gleichartigen Aufruf zwei oder mehr Varianten der Funktionsausf\u00fchrung, auch Polymorphie genannt (Vielgestaltigkeit).<\/p>\n<h4>Dynamische versus statische Polymorphie<\/h4>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2277 size-large\" src=\"https:\/\/www.microconsult.de\/blog\/wp-content\/uploads\/2023\/02\/Polymorphismus_Bild2-1024x274.png\" alt=\"Polymorphie bei Klassen-Funktionen mit Zugreifer\" width=\"660\" height=\"177\" data-wp-pid=\"2277\" \/><\/p>\n<p><em>Bild 2: Polymorphie bei Klassen-Funktionen mit Zugreifer<\/em><\/p>\n<p>Bei der Anwendung der <strong>dynamischen Polymorphie<\/strong> ist es eine Laufzeit-Entscheidung, welche der m\u00f6glichen Funktionen aufgerufen wird (dynamische \/ sp\u00e4te Bindung), und die aufrufbare <strong>Funktion<\/strong> ist gegen eine andere ebenfalls <strong>zur Laufzeit austauschbar<\/strong>.<\/p>\n<p>Bei der Anwendung der <strong>statischen Polymorphie<\/strong> ist es eine Compilezeit-Entscheidung, welche der m\u00f6glichen Funktionen aufgerufen wird (statisch \/ fr\u00fche Bindung), und die aufrufbare <strong>Funktion<\/strong> ist gegen eine andere nur <strong>zur Compilezeit austauschbar<\/strong>.<\/p>\n<h4>Beispiel: Ressourcen-Zugriffsschutz<\/h4>\n<p>Die Klasse cCounter ist nicht thread-safe, da sie innerhalb verschiedener Funktionen auf die statische Member-Variable mStartValue zugreift.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2278 size-medium\" src=\"https:\/\/www.microconsult.de\/blog\/wp-content\/uploads\/2023\/02\/Polymorphismus_Bild3-300x275.png\" alt=\"Klasse cCounter\" width=\"300\" height=\"275\" data-wp-pid=\"2278\" \/><\/p>\n<p><em>Bild 3: Klasse cCounter<\/em><\/p>\n<p>In der von cCounter spezialisierten (vererbten) Klasse cCounter_ThreadSafe soll durch verschiedenartige Betriebssystem-Mechanismen (Critical Section, Mutex, sp\u00e4ter optional Semaphore) der Ressourcenschutz f\u00fcr mStartValue flexibel austauschbar gew\u00e4hrleistet werden.<\/p>\n<p>F\u00fcr die gleichartigen Betriebssystem-Mechanismen Klassen bietet sich die Anwendung der Polymorphie an: Die Klassen cCriticalSection, cMutex und cSemaphore enthalten semantisch identische Funktionen zum Anfordern \/ Sperren lock()und zum Freigeben der Ressource unlock(). Die weiteren Detailunterscheidungen dieser Ressource-Schutzmechanismen stehen nicht im Mittelpunkt dieses Beitrags und werden hier nicht weiter erl\u00e4utert.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2279\" src=\"https:\/\/www.microconsult.de\/blog\/wp-content\/uploads\/2023\/02\/Polymorphismus_Bild4.png\" alt=\"Beispiel Ressourcen-Zugriffsschutz: Architektur und Design\" width=\"2044\" height=\"1006\" data-wp-pid=\"2279\" \/><\/p>\n<p><em>Bild 4: Beispiel Ressourcen-Zugriffsschutz: Architektur und Design<\/em><\/p>\n<p>Der folgende Abschnitt stellt drei konkrete <strong>Design- und Implementierungsans\u00e4tze<\/strong> vor:<\/p>\n<ul>\n<li><strong>Interface und Assoziation<\/strong><\/li>\n<li><strong>Template Parameter<\/strong><\/li>\n<li><strong>CRTP (Curiously Recurring Template Pattern)<\/strong><\/li>\n<\/ul>\n<p>Neben der Unterscheidung zwischen dynamischer und statischer Polymorphie erfolgt ebenfalls ein Effizienzvergleich.<\/p>\n<h4>Interface und Assoziation<\/h4>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2280\" src=\"https:\/\/www.microconsult.de\/blog\/wp-content\/uploads\/2023\/02\/Polymorphismus_Bild5.png\" alt=\"Interface und Assoziation: Architektur und Design\" width=\"1299\" height=\"635\" data-wp-pid=\"2280\" \/><\/p>\n<p><em>Bild 5: Interface und Assoziation: Architektur und Design<\/em><\/p>\n<p>Die gemeinsame Interface-Klasse icResourceLocker abstrahiert die konkreten Ressource-Locker-Funktionen lock() und unlock(). In C++ sind dies rein virtuelle Funktionen.<\/p>\n<pre><strong>class<\/strong> <strong>icResourceLocker<\/strong>\r\n{\r\n\u00a0\u00a0public:\r\n\u00a0\u00a0\u00a0\u00a0virtual ~icResourceLocker() =default;\r\n\u00a0\u00a0\u00a0\u00a0<strong>virtual<\/strong> <strong>void<\/strong><strong> lock(<\/strong><strong>void<\/strong><strong>) \u00a0 \u00a0 =0<\/strong>;\r\n\u00a0\u00a0\u00a0\u00a0<strong>virtual<\/strong> <strong>void<\/strong><strong> unlock(<\/strong><strong>void<\/strong><strong>) \u00a0 =0<\/strong>;\r\n};<\/pre>\n<p>Die beiden Ressource-Locker-Klassen cCriticalSection und cMutex implementieren das Interface durch eine Vererbung und \u00fcberschreiben die Interface-Funktionen.<\/p>\n<pre><strong>class<\/strong> <strong>cMutex<\/strong> : public icResourceLocker\r\n{\r\n\u00a0\u00a0public:\r\n\u00a0\u00a0\u00a0\u00a0cMutex(void) \u00a0 \u00a0 \u00a0 =default;\r\n\u00a0\u00a0\u00a0\u00a0~cMutex() override =default;\r\n\u00a0\u00a0\u00a0\u00a0<strong>void<\/strong><strong> lock(<\/strong><strong>void<\/strong><strong>) \u00a0 <\/strong><strong>override<\/strong>;\r\n\u00a0\u00a0\u00a0\u00a0<strong>void<\/strong><strong> unlock(<\/strong><strong>void<\/strong><strong>) <\/strong><strong>override<\/strong>;\r\n\u00a0\r\n\u00a0\u00a0private:\r\n\u00a0\u00a0\u00a0\u00a0<strong>ecLockStatus_t<\/strong> mStatus = ecLockStatus_t::Unlocked;\r\n};<\/pre>\n<p>Auf die Anbindung an ein konkretes Betriebssystem wurde hier verzichtet, da es nicht weiter zum Verst\u00e4ndnis der Polymorphie erforderlich ist. Zur Symbolisierung des Ressourcen-Zustands ist die Klasse ecLockStatus_t als enum class enthalten.<\/p>\n<pre>void <strong>cMutex<\/strong><strong>::lock(<\/strong>void<strong>)<\/strong>\r\n<strong>{<\/strong>\r\n\u00a0\u00a0\/\/ ... operating system call\r\n\u00a0\u00a0mStatus = ecLockStatus_t::Locked;\r\n\u00a0\u00a0showValue(\"nMutex status = \u00a0 locked\");\r\n<strong>}<\/strong>\r\nvoid <strong>cMutex<\/strong><strong>::unlock(<\/strong>void<strong>)<\/strong>\r\n<strong>{<\/strong>\r\n\u00a0\u00a0\/\/ ... operating system call\r\n\u00a0\u00a0mStatus = ecLockStatus_t::Unlocked;\r\n\u00a0\u00a0showValue(\"nMutex status = unlocked\");\r\n<strong>}<\/strong><\/pre>\n<p>Die showValue()Ausgabefunktion ist Teil der in den Beispielen enthaltenen kleinen Plattform zur Portierung auf beliebige Targets. Die Implementierungen von cCriticalSection und cMutex sind wesentlich identisch.<\/p>\n<p>Die von cCounter abgeleitete Klasse cCounter__ThreadSafe definiert die Zugriffsfunktionen auf das statische Attribut mStartValue der Basisklasse mit Ressourcen-Schutz neu.<\/p>\n<pre><strong>class<\/strong> <strong>cCounter_ThreadSafe <\/strong>: public cCounter\r\n{\r\n\u00a0\u00a0public:\r\n\u00a0\u00a0\u00a0\u00a0cCounter_ThreadSafe(\r\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<strong>icResourceLocker<\/strong><strong>* <\/strong><strong>const<\/strong> <strong>ptrResourceLocker<\/strong><strong> = <\/strong><strong>nullptr<\/strong>,\r\n \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0uint32_t const CountValue = 0);\r\n\u00a0\u00a0\u00a0\u00a0~cCounter_ThreadSafe() override =default;\r\n\u00a0\u00a0\u00a0\u00a0<strong>void<\/strong><strong> setStartValue(<\/strong><strong>uint32_t<\/strong> <strong>const<\/strong> <strong>StartValue<\/strong><strong>);<\/strong>\r\n<strong>\u00a0\u00a0\u00a0\u00a0<\/strong><strong>uint32_t<\/strong><strong> getStartValue(<\/strong><strong>void<\/strong><strong>);<\/strong>\r\n\u00a0\u00a0\u00a0\u00a0<strong>void<\/strong><strong> setCountToStartValue(<\/strong><strong>void<\/strong><strong>)<\/strong><strong>;<\/strong>\r\n\u00a0\u00a0\u00a0\u00a0<strong>void<\/strong><strong> setResourceLocker(<\/strong><strong>icResourceLocker<\/strong><strong>* <\/strong><strong>const ptrResourceLocker<\/strong><strong>)<\/strong>;\r\n\r\n\u00a0\u00a0private:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<strong>icResourceLocker<\/strong><strong>* mptrResourceLocker<\/strong>;\r\n};<\/pre>\n<p>Der Zugriff auf den Resource-Locker erfolgt \u00fcber den Zeiger mptrResourceLocker vom Typ der Interface-Klasse icResourceLocker. Somit kann der Zeiger auf ein Objekt vom Typ cCrtiticalSection oder cMutex zeigen (siehe LSP [Liskov Substitution Principle]). \u00dcber den Konstruktor und \/ oder die cCounter_ThreadSafe::setResourceLocker() Funktion erfolgt die Auswahl des gew\u00fcnschten Resource-Lockers.<\/p>\n<pre><strong>void<\/strong> <strong>cCounter_ThreadSafe<\/strong><strong>::setCountToStartValue(<\/strong><strong>void<\/strong><strong>)<\/strong>\r\n{\r\n\u00a0\u00a0if (mptrResourceLocker != nullptr)\r\n\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0<strong>mptrResourceLocker-&gt;lock()<\/strong>;\r\n\u00a0\u00a0}\r\n\u00a0\u00a0cCounter::setCountToStartValue();\r\n\u00a0\u00a0\u00a0\r\n\u00a0\u00a0if (mptrResourceLocker != nullptr)\r\n\u00a0\u00a0{\r\n \u00a0\u00a0\u00a0<strong>mptrResourceLocker-&gt;unlock()<\/strong>;\r\n\u00a0\u00a0}\r\n}<\/pre>\n<p>Das Beispiel der cCounter_ThreadSafe::setCountToStartValue() Funktion zeigt exemplarisch die Anwendung des Resource-Schutzmechanismus: sperren, zugreifen und freigeben. Der Aufruf der Funktionen lock() und unlock() erfolgt jeweils \u00fcber den Zeiger. Somit ist der konkrete Aufruf \/ Bindung vom Typ des Objektes abh\u00e4ngig, auf welches der Zeiger initialisiert ist. Dabei greift der Mechanismus der dynamischen Bindung mittels VMT (Virtual Method Tables). Hier zeigt sich die Anwendung der Polymorphie.<\/p>\n<p>Die Anwendung instanziiert Resource-Locker-Objekte und initialisiert damit Thread-Safe Counter-Objekte.<\/p>\n<pre>Resource_Locker::<strong>cCriticalSection<\/strong><strong> locCriticalSection{ }<\/strong>;\r\nResource_Locker::<strong>cMutex<\/strong><strong> locMutex{ }<\/strong>;\r\n\r\nCounter::<strong>cCounter_ThreadSafe<\/strong><strong> locCounter_A{ &amp;locCriticalSection }<\/strong>;\r\nCounter::<strong>cCounter_ThreadSafe<\/strong><strong> locCounter_B{ &amp;locMutex }<\/strong>;<\/pre>\n<p>Unter anderem sind Funktionen, die den Ressourcen-Schutz enthalten, auf die Z\u00e4hlerobjekte anwendbar.<\/p>\n<pre>locCounter_A.<strong>setCountToStartValue()<\/strong>;\r\nlocCounter_B.<strong>setCountToStartValue()<\/strong>;\r\nlocCounter_A.count();\r\nlocCounter_B.count();<\/pre>\n<p>Mittels der Funktion cCounter_ThreadSafe::setResourceLocker() lassen sich die Resource-Locker-Objekte zur <strong>Laufzeit<\/strong> tauschen.<\/p>\n<pre><strong>locCounter_A.setResourceLocker(&amp;locMutex)<\/strong>;\r\n<strong>locCounter_B.setResourceLocker(&amp;locCriticalSection)<\/strong>;<\/pre>\n<p>Somit entspricht diese Variante einem Beispiel f\u00fcr die <strong>dynamische Polymorphie<\/strong>.<\/p>\n<h4>Template Parameter<\/h4>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2281\" src=\"https:\/\/www.microconsult.de\/blog\/wp-content\/uploads\/2023\/02\/Polymorphismus_Bild6.png\" alt=\"Template Parameter: Architektur und Design\" width=\"2008\" height=\"1010\" data-wp-pid=\"2281\" \/><\/p>\n<p><em>Bild 6: Template Parameter: Architektur und Design<\/em><\/p>\n<p>Im Vergleich zu der vorherigen Variante enth\u00e4lt der Resource-Locker kein Interface und keine virtuellen Funktionen mehr.<\/p>\n<pre><strong>class<\/strong> <strong>cMutex<\/strong>\r\n{\r\n\u00a0\u00a0public:\r\n\u00a0\u00a0\u00a0\u00a0cMutex(void) =default;\r\n\u00a0\u00a0\u00a0\u00a0~cMutex()\u00a0 \u00a0 =default;\r\n\u00a0\u00a0\u00a0\u00a0<strong>void<\/strong><strong> lock(<\/strong><strong>void<\/strong><strong>)<\/strong>;\r\n\u00a0\u00a0\u00a0\u00a0<strong>void<\/strong><strong> unlock(<\/strong><strong>void<\/strong><strong>)<\/strong>;\r\n\u00a0\r\n\u00a0\u00a0private:\r\n\u00a0\u00a0\u00a0\u00a0ecLockStatus_t mStatus = ecLockStatus_t::Unlocked;\r\n};<\/pre>\n<p>Die weitere Implementierung von cMutex und cCriticalSection bleibt unver\u00e4ndert.<\/p>\n<p>Diese Variante ersetzt den vorherigen Interface-Zeiger in der Klasse cCounter_ThreadSafe der Template Parameter ResourceLocker_T. Die sp\u00e4tere Typisierung dieses Parameters selektiert den zur Anwendung kommenden Resource-Locker, was wiederum einer Polymorphie entspricht.<\/p>\n<pre><strong>template<\/strong><strong>&lt;<\/strong><strong>typename<\/strong> <strong>ResourceLocker_T<\/strong><strong>&gt;<\/strong>\r\nclass tcCounter_ThreadSafe : public cCounter\r\n{\r\n\u00a0\u00a0public:\r\n\u00a0\u00a0\u00a0\u00a0tcCounter_ThreadSafe(uint32_t const CountValue = 0);\r\n\u00a0\u00a0\u00a0\u00a0~tcCounter_ThreadSafe() =default;\r\n\u00a0\u00a0\u00a0\u00a0<strong>void<\/strong><strong> setStartValue(<\/strong><strong>uint32_t<\/strong> <strong>const<\/strong> <strong>StartValue<\/strong><strong>)<\/strong>;\r\n\u00a0\u00a0\u00a0\u00a0<strong>uint32_t<\/strong><strong> getStartValue(<\/strong><strong>void<\/strong><strong>)<\/strong>;\r\n\u00a0\u00a0\u00a0\u00a0<strong>void<\/strong><strong> setCountToStartValue(<\/strong><strong>void<\/strong><strong>)<\/strong>;\r\n\u00a0\u00a0private:\r\n\u00a0\u00a0\u00a0\u00a0<strong>ResourceLocker_T<\/strong><strong> mResourceLocker<\/strong>;\r\n};<\/pre>\n<p>Anstatt des Interface-Zeigers kommt ein konkretes Objekt vom Typ des Template Parameters zur Anwendung; somit entfallen die sonst ben\u00f6tigten Zeigerabfragen.<\/p>\n<pre><strong>template<\/strong><strong>&lt;<\/strong><strong>typename<\/strong> <strong>ResourceLocker_T<\/strong><strong>&gt;<\/strong>\r\n<strong>void<\/strong> <strong>tcCounter_ThreadSafe<\/strong><strong>&lt;<\/strong><strong>ResourceLocker_T<\/strong><strong>&gt;::setCountToStartValue(<\/strong><strong>void<\/strong><strong>)<\/strong>\r\n{\r\n\u00a0\u00a0<strong>mResourceLocker.lock()<\/strong>;\r\n\u00a0\u00a0cCounter::setCountToStartValue();\r\n\u00a0\u00a0<strong>mResourceLocker.unlock()<\/strong>;\r\n}<\/pre>\n<p>Die Bindung zwischen Objekt und Funktion erfolgt in diesem Fall statisch \/ fr\u00fch, also zur Compilezeit.<\/p>\n<p>Die Anwendung instanziiert Objekte der Template-Klasse cCounter_ThreadSafe und initialisiert damit den Resource-Locker \u00fcber den Template Parameter.<\/p>\n<pre><strong>tcCounter_ThreadSafe<\/strong><strong>&lt;<\/strong><strong>cCriticalSection<\/strong><strong>&gt; locCounter_CriticalSection{ }<\/strong>;\r\n<strong>tcCounter_ThreadSafe<\/strong><strong>&lt;<\/strong><strong>cMutex<\/strong><strong>&gt; \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 locCounter_Mutex{ }<\/strong>;<\/pre>\n<p>Im Vergleich zur vorherigen Variante lassen sich hier die Resource-Locker nur zur Codier- \/ Compilezeit festlegen, aber nicht mehr zur Laufzeit tauschen.<\/p>\n<p>Somit entspricht diese Variante einem Beispiel f\u00fcr die <strong>statische Polymorphie<\/strong>.<\/p>\n<h4>CRTP<\/h4>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2282\" src=\"https:\/\/www.microconsult.de\/blog\/wp-content\/uploads\/2023\/02\/Polymorphismus_Bild7.png\" alt=\"Architektur und Design\" width=\"2011\" height=\"1053\" data-wp-pid=\"2282\" \/><\/p>\n<p><em>Bild 7: CRTP: Architektur und Design<\/em><\/p>\n<p>Ein Kritikpunkt an der Template-Parameter-Variante k\u00f6nnte der sein, dass eine gemeinsame Interface-Vereinbarung f\u00fcr die Resource-Locker-Klassen fehlt. Diesen Kritikpunkt eliminiert die Anwendung des Curiously Recurring Template Patterns (CRTP).<\/p>\n<pre><strong>template<\/strong><strong>&lt;<\/strong><strong>typename<\/strong> <strong>ResourceLocker_T<\/strong><strong>&gt;<\/strong>\r\n<strong>class<\/strong> <strong>ticResourceLocker<\/strong>\r\n{\r\n\u00a0\u00a0public:\r\n\u00a0\u00a0\u00a0\u00a0ticResourceLocker(void) =default;\r\n\u00a0\u00a0\u00a0\u00a0~ticResourceLocker()\u00a0 \u00a0 =default;\r\n\u00a0\u00a0\u00a0\u00a0<strong>void<\/strong><strong> lock(<\/strong><strong>void<\/strong><strong>)<\/strong>;\r\n\u00a0\u00a0\u00a0\u00a0<strong>void<\/strong><strong> unlock(<\/strong><strong>void<\/strong><strong>)<\/strong>;\r\n};<\/pre>\n<p>Auch diese Implementierungsvariante bleibt frei von virtuellen Funktionen. Die Interface-Klasse ist nun ebenfalls eine Template-Klasse, die als Template-Parameter den konkreten Resource-Locker erwartet.<\/p>\n<pre>} template&lt;typename ResourceLocker_T&gt;\r\nvoid ticResourceLocker&lt;ResourceLocker_T&gt;::<strong>lock(<\/strong>void<strong>)<\/strong>\r\n{\r\n\u00a0\u00a0<strong>static_cast<\/strong><strong>&lt;<\/strong><strong>ResourceLocker_T<\/strong><strong>*<\/strong><strong>&gt;(<\/strong><strong>this<\/strong><strong>)-&gt;lock()<\/strong>;\r\n}\r\ntemplate&lt;typename ResourceLocker_T&gt;\r\nvoid ticResourceLocker&lt;ResourceLocker_T&gt;::<strong>unlock(<\/strong>void<strong>)<\/strong>\r\n{\r\n\u00a0\u00a0<strong>static_cast<\/strong><strong>&lt;<\/strong><strong>ResourceLocker_T<\/strong><strong>*<\/strong><strong>&gt;(<\/strong><strong>this<\/strong><strong>)-&gt;unlock()<\/strong>;\r\n}<\/pre>\n<p>Die Funktionen ticResourceLocker::lock() und ticResourceLocker::unlock() rufen jeweils \u00fcber den Template Parameter die entsprechend in den abgeleiteten Klassen spezialisierten Funktionen auf.<\/p>\n<pre><strong>class<\/strong> <strong>cMutex<\/strong> : public <strong>ticResourceLocker<\/strong><strong>&lt;<\/strong><strong>cMutex<\/strong><strong>&gt;<\/strong>\r\n{\r\n\u00a0\u00a0public:\r\n\u00a0\u00a0\u00a0\u00a0cMutex(void) =default;\r\n\u00a0\u00a0\u00a0\u00a0~cMutex()\u00a0 \u00a0 =default;\r\n\u00a0\u00a0\u00a0\u00a0<strong>void<\/strong><strong> lock(<\/strong><strong>void<\/strong><strong>)<\/strong>;\r\n\u00a0\u00a0\u00a0\u00a0<strong>void<\/strong><strong> unlock(<\/strong><strong>void<\/strong><strong>)<\/strong>;\r\n\u00a0\u00a0\u00a0\u00a0\r\n\u00a0\u00a0private:\r\n\u00a0\u00a0\u00a0\u00a0ecLockStatus_t mStatus = ecLockStatus_t::Unlocked;\r\n};<\/pre>\n<p>Bei der Vererbungsimplementierung wird bereits der Template Parameter der Basisklasse mit dem Typ der erbenden Klasse spezifiziert (MixedIn). Dies ist am Beispiel der Klasse cMutex gezeigt.<\/p>\n<pre>void <strong>cMutex<\/strong><strong>::lock(<\/strong>void<strong>)<\/strong>\r\n<strong>{<\/strong>\r\n\u00a0\u00a0\/\/ ... operating system call\r\n\u00a0\u00a0mStatus = ecLockStatus_t::Locked;\r\n\u00a0\u00a0showValue(\"nMutex status = \u00a0 locked\");\r\n<strong>}<\/strong>\r\n\r\nvoid <strong>cMutex<\/strong><strong>::unlock(<\/strong>void<strong>)<\/strong>\r\n<strong>{<\/strong>\r\n\u00a0\u00a0\/\/ ... operating system call\r\n\u00a0\u00a0mStatus = ecLockStatus_t::Unlocked;\r\n\u00a0\u00a0showValue(\"nMutex status = unlocked\");\r\n<strong>}<\/strong><\/pre>\n<p>Die Funktionsimplementierungen von lock() und unlock() bleiben unver\u00e4ndert. Ebenfalls unver\u00e4ndert im Vergleich mit der Variante Template Parameter bleibt die cCounter_ThreadSafe Klassenimplementierung.<\/p>\n<pre><strong>tcCounter_ThreadSafe&lt;cCriticalSection&gt; locCounter_CriticalSection{ };<\/strong>\r\n\r\n<strong>tcCounter_ThreadSafe&lt;cMutex&gt; locCounter_Mutex{ };<\/strong><\/pre>\n<p>Der Resource-Locker wird nur zur Codier- \/ Compilezeit festgelegt und ist nicht zur Laufzeit tauschbar.<\/p>\n<p>Somit entspricht diese Variante einem zweiten, erweiterten Beispiel f\u00fcr die <strong>statische Polymorphie<\/strong>.<\/p>\n<h4>Vergleich<\/h4>\n<p>Dieser Abschnitt vergleicht alle drei Varianten (Interface und Assoziation, Template Parameter und CRTP). Die Verbrauchsangaben basieren auf dem folgenden Setup:<\/p>\n<ul>\n<li>STM32F407 Mikrocontroller mit SYSCLK = 168MHz<\/li>\n<li>MCBSTM32F400 Evaluation Board<\/li>\n<li>MDK-ARM v5.35.0.2 Tool Chain<\/li>\n<li>ARM Clang Compiler v6.16<\/li>\n<li>Compiler Optimierung: Default<\/li>\n<li>C++14<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2306\" src=\"https:\/\/www.microconsult.de\/blog\/wp-content\/uploads\/2023\/02\/tabelle.jpg\" alt=\"\" width=\"930\" height=\"777\" data-wp-pid=\"2306\" \/><\/p>\n<p><strong><br \/>\nRes\u00fcmee<\/strong><br \/>\nDie Implementierung der statischen Polymorphie ist aus der Perspektive der Software-Qualit\u00e4tsmerkmale funktionale Sicherheit, Angriffssicherheit, Zuverl\u00e4ssigkeit und Verbrauchsverhalten immer die bessere Wahl. Der Preis, der daf\u00fcr zu zahlen ist, ist der Verlust der positiven Unterst\u00fctzung von Software-Qualit\u00e4tsmerkmalen wie \u00c4nderbarkeit, Erweiterbarkeit oder Anpassbarkeit durch die dynamische Polymorphie.<\/p>\n<p>Die Entscheidung &#8222;dynamische versus statische Polymorphie&#8220; muss nicht digital f\u00fcr die gesamte Software-Architektur getroffen werden \u2013 Mischformen sind denkbar. Doch wie immer h\u00e4ngen die konkreten Entscheidungen von den konkreten Software-Anforderungen ab.<\/p>\n<h3>Weiterf\u00fchrende Informationen<\/h3>\n<p><a href=\"https:\/\/www.microconsult.de\/embedded-und-echtzeit-softwareentwicklung\/\" target=\"_blank\" rel=\"noopener\"><strong>MicroConsult Fachwissen zum Thema Embedded SW-Entwicklung<\/strong><\/a><\/p>\n<p><a href=\"https:\/\/www.microconsult.de\/trainings-beratung\/trainings\/analyse-design-und-architektur\/AAAAKBL\" target=\"_blank\" rel=\"noopener\"><strong>MicroConsult Training &amp; Coaching zu Analyse, Design, Architektur<\/strong><\/a><\/p>\n<p><strong><a href=\"https:\/\/www.microconsult.de\/alle-trainings-termine-komplettuebersicht\/\" target=\"_blank\" rel=\"noopener\">Alle Trainings &amp; Termine auf einen Blick<\/a><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>As the complexity of embedded software increases, fulfilling quality criteria such as modifiability, extensibility, adaptability, and reusability becomes ever more important. A key means of meeting these software quality requirements is the application of polymorphic structures in architecture, design, and implementation. Software development distinguishes between dynamic and static polymorphism.\u00a0<\/p>","protected":false},"author":10,"featured_media":3444,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","inline_featured_image":false,"footnotes":""},"categories":[9,15],"tags":[295,120,373,296,10,297,289,290,374,367,14,103,87,45,368,375,369],"class_list":["post-3443","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-embedded_und_echtzeit-softwareentwicklung","category-softwareentwicklung_windows_linux_mobile","tag-c","tag-c-programmierung","tag-dynamische-polymorphie","tag-entwurfsprinzipien","tag-implementierung","tag-interface","tag-interface-konzepte","tag-interfacedesign","tag-objektorientierte-programmierung","tag-polymorphie","tag-software-architektur","tag-software-entwicklung","tag-softwarearchitektur","tag-softwareentwicklung","tag-statisch","tag-statische-polymorphie","tag-uml"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>C++ Programmierung: Dynamische oder statische Polymorphie? - MicroConsult Academy GmbH<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.microconsult.de\/en\/tb_polymorphy\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C++ Programmierung: Dynamische oder statische Polymorphie? - MicroConsult Academy GmbH\" \/>\n<meta property=\"og:description\" content=\"Mit steigender Komplexit\u00e4t von Embedded-Software erlangt die Erf\u00fcllung von Qualit\u00e4tsmerkmalen, wie \u00c4nderbarkeit, Erweiterbarkeit, Anpassbarkeit und Wiederverwendbarkeit, eine immer gr\u00f6\u00dfere Bedeutung. Ein wichtiges Mittel, um diese Software-Qualit\u00e4tsanforderungen zu erf\u00fcllen, ist die Anwendung von polymorphen Strukturen in der Architektur, im Design und in der Implementierung. Die Softwareentwicklung unterscheidet dynamische und statische Polymorphie.\u00a0\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.microconsult.de\/en\/tb_polymorphy\/\" \/>\n<meta property=\"og:site_name\" content=\"MicroConsult Academy GmbH\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-30T04:16:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-17T11:15:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/07\/Polymorphie-Programmieren.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"806\" \/>\n\t<meta property=\"og:image:height\" content=\"595\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Thomas Batt\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Thomas Batt\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/tb_polymorphie\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/tb_polymorphie\\\/\"},\"author\":{\"name\":\"Thomas Batt\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/344ea687ec9637d76b9f570373cae5eb\"},\"headline\":\"C++ Programmierung: Dynamische oder statische Polymorphie?\",\"datePublished\":\"2026-01-30T04:16:00+00:00\",\"dateModified\":\"2026-06-17T11:15:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/tb_polymorphie\\\/\"},\"wordCount\":1149,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/tb_polymorphie\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.microconsult.de\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Polymorphie-Programmieren.jpg\",\"keywords\":[\"C++\",\"C++ Programmierung\",\"dynamische Polymorphie\",\"Entwurfsprinzipien\",\"Implementierung\",\"Interface\",\"Interface-Konzepte\",\"Interfacedesign\",\"objektorientierte Programmierung\",\"Polymorphie\",\"Software-Architektur\",\"Software-Entwicklung\",\"Softwarearchitektur\",\"Softwareentwicklung\",\"statisch\",\"statische Polymorphie\",\"UML\"],\"articleSection\":[\"Embedded- und Echtzeit-Softwareentwicklung\",\"Softwareentwicklung (Windows, Linux)\"],\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.microconsult.de\\\/tb_polymorphie\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/tb_polymorphie\\\/\",\"url\":\"https:\\\/\\\/www.microconsult.de\\\/tb_polymorphie\\\/\",\"name\":\"C++ Programmierung: Dynamische oder statische Polymorphie? - MicroConsult Academy GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/tb_polymorphie\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/tb_polymorphie\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.microconsult.de\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Polymorphie-Programmieren.jpg\",\"datePublished\":\"2026-01-30T04:16:00+00:00\",\"dateModified\":\"2026-06-17T11:15:52+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/344ea687ec9637d76b9f570373cae5eb\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/tb_polymorphie\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.microconsult.de\\\/tb_polymorphie\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/tb_polymorphie\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.microconsult.de\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Polymorphie-Programmieren.jpg\",\"contentUrl\":\"https:\\\/\\\/www.microconsult.de\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/Polymorphie-Programmieren.jpg\",\"width\":806,\"height\":595},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/tb_polymorphie\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.microconsult.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C++ Programmierung: Dynamische oder statische Polymorphie?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#website\",\"url\":\"https:\\\/\\\/www.microconsult.de\\\/\",\"name\":\"MicroConsult Academy GmbH\",\"description\":\"Professionelle Schulungen, Beratung und Projektunterst\u00fctzung\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.microconsult.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.microconsult.de\\\/#\\\/schema\\\/person\\\/344ea687ec9637d76b9f570373cae5eb\",\"name\":\"Thomas Batt\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6e2cfb0fb9027df3be0b60804d3dd07e5061a84cf3a0fc3a5adcc8c5f114e6b9?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6e2cfb0fb9027df3be0b60804d3dd07e5061a84cf3a0fc3a5adcc8c5f114e6b9?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/6e2cfb0fb9027df3be0b60804d3dd07e5061a84cf3a0fc3a5adcc8c5f114e6b9?s=96&d=mm&r=g\",\"caption\":\"Thomas Batt\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C++ Programming: Dynamic or Static Polymorphism? - MicroConsult Academy GmbH","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.microconsult.de\/en\/tb_polymorphy\/","og_locale":"en_GB","og_type":"article","og_title":"C++ Programmierung: Dynamische oder statische Polymorphie? - MicroConsult Academy GmbH","og_description":"Mit steigender Komplexit\u00e4t von Embedded-Software erlangt die Erf\u00fcllung von Qualit\u00e4tsmerkmalen, wie \u00c4nderbarkeit, Erweiterbarkeit, Anpassbarkeit und Wiederverwendbarkeit, eine immer gr\u00f6\u00dfere Bedeutung. Ein wichtiges Mittel, um diese Software-Qualit\u00e4tsanforderungen zu erf\u00fcllen, ist die Anwendung von polymorphen Strukturen in der Architektur, im Design und in der Implementierung. Die Softwareentwicklung unterscheidet dynamische und statische Polymorphie.\u00a0","og_url":"https:\/\/www.microconsult.de\/en\/tb_polymorphy\/","og_site_name":"MicroConsult Academy GmbH","article_published_time":"2026-01-30T04:16:00+00:00","article_modified_time":"2026-06-17T11:15:52+00:00","og_image":[{"width":806,"height":595,"url":"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/07\/Polymorphie-Programmieren.jpg","type":"image\/jpeg"}],"author":"Thomas Batt","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Thomas Batt","Estimated reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.microconsult.de\/tb_polymorphie\/#article","isPartOf":{"@id":"https:\/\/www.microconsult.de\/tb_polymorphie\/"},"author":{"name":"Thomas Batt","@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/344ea687ec9637d76b9f570373cae5eb"},"headline":"C++ Programmierung: Dynamische oder statische Polymorphie?","datePublished":"2026-01-30T04:16:00+00:00","dateModified":"2026-06-17T11:15:52+00:00","mainEntityOfPage":{"@id":"https:\/\/www.microconsult.de\/tb_polymorphie\/"},"wordCount":1149,"commentCount":0,"image":{"@id":"https:\/\/www.microconsult.de\/tb_polymorphie\/#primaryimage"},"thumbnailUrl":"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/07\/Polymorphie-Programmieren.jpg","keywords":["C++","C++ Programmierung","dynamische Polymorphie","Entwurfsprinzipien","Implementierung","Interface","Interface-Konzepte","Interfacedesign","objektorientierte Programmierung","Polymorphie","Software-Architektur","Software-Entwicklung","Softwarearchitektur","Softwareentwicklung","statisch","statische Polymorphie","UML"],"articleSection":["Embedded- und Echtzeit-Softwareentwicklung","Softwareentwicklung (Windows, Linux)"],"inLanguage":"en-GB","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.microconsult.de\/tb_polymorphie\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.microconsult.de\/tb_polymorphie\/","url":"https:\/\/www.microconsult.de\/tb_polymorphie\/","name":"C++ Programming: Dynamic or Static Polymorphism? - MicroConsult Academy GmbH","isPartOf":{"@id":"https:\/\/www.microconsult.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.microconsult.de\/tb_polymorphie\/#primaryimage"},"image":{"@id":"https:\/\/www.microconsult.de\/tb_polymorphie\/#primaryimage"},"thumbnailUrl":"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/07\/Polymorphie-Programmieren.jpg","datePublished":"2026-01-30T04:16:00+00:00","dateModified":"2026-06-17T11:15:52+00:00","author":{"@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/344ea687ec9637d76b9f570373cae5eb"},"breadcrumb":{"@id":"https:\/\/www.microconsult.de\/tb_polymorphie\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.microconsult.de\/tb_polymorphie\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.microconsult.de\/tb_polymorphie\/#primaryimage","url":"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/07\/Polymorphie-Programmieren.jpg","contentUrl":"https:\/\/www.microconsult.de\/wp-content\/uploads\/2025\/07\/Polymorphie-Programmieren.jpg","width":806,"height":595},{"@type":"BreadcrumbList","@id":"https:\/\/www.microconsult.de\/tb_polymorphie\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.microconsult.de\/"},{"@type":"ListItem","position":2,"name":"C++ Programmierung: Dynamische oder statische Polymorphie?"}]},{"@type":"WebSite","@id":"https:\/\/www.microconsult.de\/#website","url":"https:\/\/www.microconsult.de\/","name":"MicroConsult Academy GmbH","description":"Professional training, consulting and project support","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.microconsult.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Person","@id":"https:\/\/www.microconsult.de\/#\/schema\/person\/344ea687ec9637d76b9f570373cae5eb","name":"Thomas Batt","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/secure.gravatar.com\/avatar\/6e2cfb0fb9027df3be0b60804d3dd07e5061a84cf3a0fc3a5adcc8c5f114e6b9?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/6e2cfb0fb9027df3be0b60804d3dd07e5061a84cf3a0fc3a5adcc8c5f114e6b9?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6e2cfb0fb9027df3be0b60804d3dd07e5061a84cf3a0fc3a5adcc8c5f114e6b9?s=96&d=mm&r=g","caption":"Thomas Batt"}}]}},"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/3443","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/comments?post=3443"}],"version-history":[{"count":2,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/3443\/revisions"}],"predecessor-version":[{"id":11460,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/posts\/3443\/revisions\/11460"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/media\/3444"}],"wp:attachment":[{"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/media?parent=3443"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/categories?post=3443"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.microconsult.de\/en\/wp-json\/wp\/v2\/tags?post=3443"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}