Heim >Backend-Entwicklung >C++ >Wie vermeide ich die Unsichtbarkeit öffentlicher Mitglieder und die Wiederholung des Quellcodes in geerbten Klassenvorlagen?

Wie vermeide ich die Unsichtbarkeit öffentlicher Mitglieder und die Wiederholung des Quellcodes in geerbten Klassenvorlagen?

DDD
DDDOriginal
2024-11-04 04:49:01863Durchsuche

How to Avoid Public Member Invisibility and Source Code Repetition in Inherited Class Templates?

Vermeiden der Unsichtbarkeit öffentlicher Mitglieder und der Wiederholung von Quellcode mit geerbten Klassenvorlagen

In der objektorientierten Programmierung ermöglicht die Vererbung, dass Klassen Eigenschaften und Methoden erben aus ihren Elternklassen. Wenn jedoch Klassenvorlagen eingeführt werden, können abgeleitete Klassen aufgrund der strikten Einhaltung des C-Standards möglicherweise nicht mehr auf öffentliche Mitglieder zugreifen. Dieses Problem kann zu Problemen führen, wenn versucht wird, in abgeleiteten Klassen auf öffentliche Mitglieder zu verweisen.

Vier bestehende Lösungen für dieses Problem wurden vorgeschlagen:

  • Referenzen mit CBase
  • Referenzen mit this-> voranstellen
  • Verwendung individueller Using-Anweisungen für jedes Mitglied
  • Deaktivierung der strikten C-Konformität

Während diese Lösungen das Problem der Barrierefreiheit beheben können, weisen sie potenzielle Nachteile auf, wie z. B. ausführlichen Code, unterdrückte virtuelle Aufrufe und Nichtportabilität.

Vorgeschlagene erweiterte Lösung

Um die bestehenden Lösungen zu verbessern, ist es möglich, Makros zu nutzen, um Lösung Nr. 3 zu vereinfachen:

<code class="c++">#include <boost/preprocessor.hpp>

#define USING_ONE(r, base, member) \
    using base::member;

#define USING_ALL(base, ...) \
    BOOST_PP_SEQ_FOR_EACH(\
        USING_ONE, base, \
        BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__) \
    )

// Near CBase<BYTES>
#define USING_CBASE(param) USING_ALL(CBase<param>, Arr, Fn1, Fn2, Fn3, Fn4, Fn5)

// In CDerived<BYTES>, in a `public:` section
USING_CBASE(BYTES);</code>

Dieser Ansatz muss hinzugefügt werden ein USING_CBASE-Makro in der Nähe der Definition von CBase und dann das Makro im öffentlichen Abschnitt von CDerived aufrufen. Es führt im Wesentlichen eine pauschale Deklaration durch, um alle ausgewählten Mitglieder von CBase sichtbar in CDerived.

Diese Lösung geht auf die Probleme von Lösung Nr. 3 ein, wie z. B. sich wiederholenden Code, indem die using-Anweisungen in Makros gekapselt werden. Durch die Einhaltung der C-Standards bleibt außerdem die Portabilität erhalten. Diese erweiterte Lösung bietet eine präzisere und effizientere Möglichkeit, die Unsichtbarkeit öffentlicher Mitglieder und die Wiederholung des Quellcodes in geerbten Klassenvorlagen zu vermeiden.

Das obige ist der detaillierte Inhalt vonWie vermeide ich die Unsichtbarkeit öffentlicher Mitglieder und die Wiederholung des Quellcodes in geerbten Klassenvorlagen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn