首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止从c++03中的类型派生?

如何防止从c++03中的类型派生?
EN

Stack Overflow用户
提问于 2012-05-25 07:04:58
回答 1查看 101关注 0票数 3

C++11引入了关键字final,这使得从类型派生是非法的。

有没有一种方法可以用C++03实现类似的结果,也许是通过将某些成员函数设为private

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-27 17:18:11

C++03有两种解决方案

第一个解决方案:具有私有默认构造函数的私有虚拟朋友基类:

基于这个answer,不同的是不使用模板-因此我们可以使虚拟基类成为“最终”类的朋友。

代码语言:javascript
复制
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 {
// ...
};

坦率地说,我不喜欢这种解决方案,因为它增加了不必要的虚拟主义。所有这些都可以包含在宏中,以增加可读性和易用性:

代码语言:javascript
复制
#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) {
// ...
};

第二种解决方案:所有构造函数都是私有的(包括复制构造函数)。类的实例是在friend类的帮助下创建的:

代码语言:javascript
复制
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;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10746499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档