如何防止推导从C ++ 03型? [重复](How to prevent derivation

2019-06-24 18:31发布

这个问题已经在这里有一个答案:

  • 用C简单的“防止派生类” ++ 2答案

C ++ 11引入关键字final ,这使得它非法从类型来推导。

有没有一种方法来实现与C ++ 03,或许可以使某些成员函数类似的结果private

Answer 1:

有两个解决方案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;
}


文章来源: How to prevent derivation from a type in c++03? [duplicate]