这篇文章主要介绍了在C++中如何阻止类被继承,对于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
}
这样我们就可以实例化SampleSealedClass,并且还不用担心被继承了。不过还是要解释一下为什么阻止了继承?
当我们写出下面的代码时,编译器在编译过程中做了什么呢?
class subclass : public SampleSealedClass
{
};
首先,当你在实例化subclass的时候,会先调用SampleSealedClass的构造函数,而在这之前会调用Sealed类的默认构造函数,但是我们发现Sealed是不能被实例化的,并且通过private virtual的继承只能被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
这里的TypeWapper主要是将外部类型传递到SealedClasses的,从而能得到访问Sealed构造函数的能力。不过这段代码在GCC4.0中通过编译,而在vs2008中不能通过。可以向下面这样来引用:
class subclass : BaseSealed<subclass>
{
public:
subclass() { cout << "subclass" << endl; }
};
// 下面这个会编译失败
class ssubclass : public subclass
{
public:
ssubclass() { cout << "ssubclass" << endl; }
};
将想法付诸于实践,借此来影响他人是一个人存在的真正价值
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程学习网的更多内容!
本文标题为:在C++中如何阻止类被继承详解


- C++ 数据结构超详细讲解顺序表 2023-03-25
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- ubuntu下C/C++获取剩余内存 2023-09-18
- C语言详解float类型在内存中的存储方式 2023-03-27
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- Qt计时器使用方法详解 2023-05-30
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- C语言qsort()函数的使用方法详解 2023-04-26
- Easyx实现扫雷游戏 2023-02-06