私は仮想デストラクタを持つ純粋な抽象基本クラスを宣言したいと思います。私はこれを行う3つの方法を知っていますが、私はどちらが最良か、なぜなら分かりません。C++でインターフェイスのような純粋な抽象基本クラスを実装するためのベストプラクティスは?
私の目標は、ベストプラクティスのC++ 11スタイルで、抽象基本クラスインターフェイスを最適な実行時パフォーマンスで実装することです。特に、私はノーオペレーションのデストラクタのインライン化/削除をお勧めします。重複したvtableを生成しない実装を選択するか、または警告を抑制する情報に基づいた決定を行うことによって、重複するvtableに関連する警告を排除したいと思います。
オプション#1
/// A.h:
class A {
public:
virtual ~A() {}
virtual int f() = 0;
};
オプション#2
/// A.h:
class A {
public:
virtual ~A();
virtual int f() = 0;
};
/// A.cpp:
A::~A() {}
オプション#:ここ
は、私が知っている抽象基本クラスを実装するための3つの方法があります3
/// A.h:
class A {
public:
virtual ~A() = default;
virtual int f() = 0;
};
これらの唯一のオプションはありますか?
#1、#2、#3のどれがベストプラクティスと見なされますか?トレードオフ(例:ランタイムとコンパイル時のパフォーマンス)がある場合は、それらを記述してください。
オプション#1を使用すると、インラインデストラクタはインライン化されますか?
オプション#1はvtableをすべての翻訳単位に入れることを理解します。オプション#1は、clangで警告が-Wweak-vtables
を生成し、gcc [1]の "曖昧なリンケージ"カテゴリでカバーされます。オプション#3はclang警告を生成しません - これはオプション#3がvtableを生成しないことを意味しますか?
どのように正確にオプション#3は、他のオプションの違いは?
その他の質問が打ち鳴らすの警告に対する同様の問題を議論してきたが、私は特に、ベストプラクティスとその理由であると考えられるオプション対処質問を見つけることができませんでした。
[1] https://gcc.gnu.org/onlinedocs/gcc/Vague-Linkage.html
[CppCoreGuidelines](https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md)には、このタイプの質問に関する良いセクションがあり、その価値があるかもしれませんあなたは読むべきです。 – Maikel
私は科学的計算を行い、私の領域ではこれらの変種のどれも多型には使用されていません。本当にパフォーマンス重視のタスクについては、[static polymorphism](https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)または[Barton-Nackman-Trick](https://en.wikipedia.org/wiki)をご覧ください。/Barton%E2%80%93Nackman_trick) – Maikel
@Maikelはい、私はそれらのテクニックも使用しています。しかし、この質問は、単純なvtableベースの多態性手法に関するものです。 –