Ich möchte eine reine abstrakte Basisklasse mit einem virtuellen Destruktor deklarieren. Ich kenne drei Wege, dies zu tun, aber ich weiß nicht, welches der beste ist oder warum.Best Practice für die Implementierung einer Schnittstelle wie reine abstrakte Basisklasse in C++?
Mein Ziel ist es, abstrakte Basisklassenschnittstellen im Best-Practice-C++ 11-Stil mit optimaler Laufzeitleistung zu implementieren. Insbesondere möchte ich es mir erlauben, No-Op-Destruktoren einzubinden/zu eliminieren. Außerdem möchte ich Warnungen in Bezug auf duplizierte VTables eliminieren, indem Sie entweder eine Implementierung auswählen, bei der die Duplikat-VTables nicht generiert werden, oder eine fundierte Entscheidung treffen, die Warnungen zu unterdrücken.
Hier sind die drei Möglichkeiten, um eine abstrakte Basisklasse zu implementieren, die ich kenne:
Option # 1
/// A.h:
class A {
public:
virtual ~A() {}
virtual int f() = 0;
};
Option # 2
/// A.h:
class A {
public:
virtual ~A();
virtual int f() = 0;
};
/// A.cpp:
A::~A() {}
Option # 3
/// A.h:
class A {
public:
virtual ~A() = default;
virtual int f() = 0;
};
Sind das meine einzigen Optionen?
Welche von # 1, # 2, # 3 gilt als Best Practice? Wenn Kompromisse bestehen (z. B. Laufzeit oder Kompilierungszeit), beschreiben Sie sie bitte.
Mit Option # 1 wird der Inline-Destruktor jemals inline?
Ich verstehe, dass Option 1 eine VTable in jede Übersetzungseinheit einfügt. Option # 1 generiert die -Wweak-vtables
Warnung in clang und wird von der Kategorie "vage linkage" in gcc [1] abgedeckt. Option # 3 generiert keine Clam-Warnung - Bedeutet dies, dass Option 3 keine vtable generiert?
Wie unterscheidet sich die Option # 3 von den anderen Optionen?
Andere Fragen haben ähnliche Probleme in Bezug auf die Warnungen von Clang diskutiert, aber ich konnte keine Frage finden, die speziell darauf abzielte, welche Option als beste Praxis angesehen wird und warum.
[1] https://gcc.gnu.org/onlinedocs/gcc/Vague-Linkage.html
Die [CppCoreGuidelines] (https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md) hat einen guten Abschnitt über diese Art von Frage und könnte es wert sein Sie zu lesen. – Maikel
Ich mache wissenschaftliche Berechnungen und in meinem Bereich wird keine dieser Varianten für Polymorphie verwendet. Für wirklich performance-kritische Aufgaben schauen Sie sich [statischer Polymorphismus] (https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) oder den [Barton-Nackman-Trick] (https://en.wikipedia.org/wiki) an/Barton% E2% 80% 93Nackman_trick) – Maikel
@Maikel Ja, ich benutze diese Techniken auch. Aber diese Frage bezieht sich auf die altmodische vtable-basierte Polymorphie-Technik. –