C ++ 11ではキーワードが導入されfinal
ているため、型から派生することは違法です。
おそらく特定のメンバー関数を作成することによって、C ++ 03で同様の結果を達成する方法はありますprivate
か?
C ++ 11ではキーワードが導入されfinal
ているため、型から派生することは違法です。
おそらく特定のメンバー関数を作成することによって、C ++ 03で同様の結果を達成する方法はありますprivate
か?
次の2つの解決策がありますC++03
。
最初の解決策:プライベートデフォルトコンストラクターを使用したプライベート仮想フレンド基本クラス:
この回答に基づいて、テンプレートが使用されないという違いがあります。したがって、仮想基本クラスを「最終」クラスの友達にすることができます。
class A;
class MakeAFinal {
private:
MakeAFinal() {}
// just to be sure none uses copy ctor to hack this solution!
MakeAFinal(const MakeAFinal&) {}
friend class A;
};
class A : private virtual MakeAFinal {
// ...
};
率直に言って、私はこのソリューションが好きではありませんでした。なぜなら、それは不必要な仮想主義を追加するからです。読みやすさと使いやすさを向上させるために、これらすべてをマクロで囲むことができます。
#define PREPARE_CLASS_FINALIZATION(CN) \
class CN; \
class Make##CN##Final { \
Make##CN##Final() {} \
Make##CN##Final(const Make##CN##Final&) {} \
friend class CN; }
#define MAKE_CLASS_FINAL(CN) private virtual Make##CN##Final
PREPARE_CLASS_FINALIZATION(A);
class A : MAKE_CLASS_FINAL(A) {
// ...
};
2番目の解決策:すべてのコンストラクターはプライベートです(コピーコンストラクターを含む)。クラスのインスタンスは、フレンドクラスを使用して作成されます。
class AInstance;
class A {
// ...
private:
// make all A constructors private (including copy constructor) to achieve A is final
A() {}
A(const A&) {} // if you like to prevent copying - achieve this in AFinal
// ...
friend class AInstance;
};
struct AInstance {
AInstance() : obj() {}
AInstance(const AInstance& other) : obj(other.obj) {}
// and all other constructors
A obj;
};
// usage:
AInstance globalA;
int main() {
AInstance localA;
AInstance ptrA = new AInstance();
std::vector<AInstance> vecA(7);
localA = globalA;
*ptrA = localA;
}