这个问题已经在这里有一个答案:
- 用C简单的“防止派生类” ++ 2答案
C ++ 11引入关键字final
,这使得它非法从类型来推导。
有没有一种方法来实现与C ++ 03,或许可以使某些成员函数类似的结果private
?
这个问题已经在这里有一个答案:
C ++ 11引入关键字final
,这使得它非法从类型来推导。
有没有一种方法来实现与C ++ 03,或许可以使某些成员函数类似的结果private
?
有两个解决方案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) {
// ...
};
解决方法二:所有构造函数是私有的(包括拷贝构造函数)。 该类的实例与友元类的帮助下创建:
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;
}