在c++中如何阻止类被继承
这个话题是源自于一个面试题,我在网上查了一下有不少这方面的解说!我自己整理了一下,选择了一个自认为是最优方案!
我们从最简单的开始:
首先,大家都知道要阻止类被实例化,可以通过使用private or protected 关键字来声明默认构造函数。那么在阻止类被继承的时候,我们需要用到这个技巧。其次,阻止类被继承还需要使用private来控制继承的基类。
namespace SamplePrivate
{
#ifdef NDEBUG
class Sealed
{
protected:
Sealed() {};
friend class SampleSealedClass; // 设置友类,以便访问Sealed的构造函数
};
class SampleSealedClass : private virtual Sealed
{
};
#else
class SampleSealedClass {}
#endif
}当我们写出下面的代码时,编译器在编译过程中做了什么呢?
class subclass : public SampleSealedClass
{
};那就需要用到模板了:
#ifdef NDEBUG
namespace SealedClasses
{
class Sealed
{
protected:
Sealed() {}
};
template<class T> class TypeWapper
{
public:
typedef T type;
};
}
template<typename T> class BaseSealed : private virtual SealedClasses::Sealed
{
friend class SealedClasses::TypeWapper<T>::type;
};
#else
template<typename T> class BaseSealed
{
};

#endif
class subclass : BaseSealed<subclass>
{
public:
subclass() { cout << "subclass" << endl; }
};
// 下面这个会编译失败
class ssubclass : public subclass
{
public:
ssubclass() { cout << "ssubclass" << endl; }
};
将想法付诸于实践,借此来影响他人是一个人存在的真正价值



浙公网安备 33010602011771号