3
A
回答
2
有用于C++03
两种解决方案:
解决方案一:私有的虚拟朋友基类私有的默认构造函数:
在此基础上answer,不同之处在于模板不使用 - 因此我们可以让虚拟基类成为“最终”类的朋友。
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;
}
相关问题
- 1. 简单的“防止派生类”,在C++
- 2. 如何防止Nhibernate获取派生类?
- 3. 从system.object派生的C#类型
- 4. 防止派生类被破坏
- 5. 如何防止在派生类中重写方法?
- 6. 包含派生类型的Fortran派生类型可以从C访问
- 7. 使用受保护的C++防止派生类的继承
- 8. 调用与派生类中派生泛型类型
- 9. C#中的静态派生类型?
- 10. 如何防止ODataConventionModelBuilder自动公开所有派生类型的元数据?
- 11. 从派生自同一类的类派生的C++子类
- 12. C++如何从基类中调用派生类中的方法
- 13. 从泛型T派生类
- 14. 从泛型类派生
- 15. java如何防止类被派生超过两个级别?
- 16. 序列化派生类型派生类型属性的数组
- 17. 从C#中的基类获取派生类型?
- 18. 如何禁止C++派生类从基地获得,而是从另一个派生类
- 19. 在C++中实例化派生类型
- 20. 如何从C派生类中获取基类的名称
- 21. 如何从C#中的基类获取派生类MEMBERS?
- 22. 从SWIGged Python中的C++基类派生
- 23. C#中,我如何从抽象类中找出派生类型? (TextWriter)
- 24. 在派生类型
- 25. 阻止所有模板派生类型
- 26. C++派生类
- 27. C++派生类
- 28. 如何从基类泛型派生泛型类?
- 29. 如何从基类型返回派生类型
- 30. C#继承防止基类的方法调用派生类的方法
如果您仍有兴趣有效的解决方案,我可以共用一个。让我知道。 – PiotrNycz
@PiotrNycz:当然 –