在C++中如何阻止类被继承详解

 更新时间:2021年09月28日 10:31:24   作者:moonz-wu  
这篇文章主要介绍了在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++ namespace相关语法实例分析

    C++ namespace相关语法实例分析

    这篇文章主要介绍了C++ namespace相关语法实例分析,对C++初学者有很好的参考借鉴价值,需要的朋友可以参考下
    2014-08-08
  • VC++ 中ListCtrl经验总结

    VC++ 中ListCtrl经验总结

    这篇文章主要介绍了VC++ 中ListCtrl经验总结的相关资料,需要的朋友可以参考下
    2015-06-06
  • C++ Boost命令行解析库的应用详解

    C++ Boost命令行解析库的应用详解

    命令行解析库是一种用于简化处理命令行参数的工具,它可以帮助开发者更方便地解析命令行参数并提供适当的帮助信息,本文主要介绍了不同的命令行解析库和它们在C++项目中的应用,希望对大家有所帮助
    2023-11-11
  • 浅谈分词器Tokenizer

    浅谈分词器Tokenizer

    分词器的工作就是分解文本流成词(tokens).在这个文本中,每一个token都是这些字符的一个子序列。一个分析器(analyzer)必须知道它所配置的字段,但是tokenizer不需要,分词器(tokenizer)从一个字符流(reader)读取数据,生成一个Token对象(TokenStream)的序列
    2021-06-06
  • Qt之实现圆形进度条的示例代码

    Qt之实现圆形进度条的示例代码

    在平时做页面开发时,有些时候会用到圆形进度条,本文主要介绍了Qt之实现圆形进度条的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • C语言实现通讯录系统课程设计

    C语言实现通讯录系统课程设计

    这篇文章主要为大家详细介绍了C语言实现通讯录系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • 浅谈C++为什么非要引入那几种类型转换

    浅谈C++为什么非要引入那几种类型转换

    这篇文章主要介绍了C++为什么非要引入那几种类型转换,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 详解如何用c++实现平衡二叉树

    详解如何用c++实现平衡二叉树

    平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),由前苏联的数学家Adelse-Velskil和Landis在1962年提出的高度平衡的二叉树,根据科学家的英文名也称为AVL树。本文介绍了它的原理和如何用C++代码来实现
    2021-06-06
  • 基于条件变量的消息队列 说明介绍

    基于条件变量的消息队列 说明介绍

    本篇文章小编为大家介绍,基于条件变量的消息队列 说明介绍。需要的朋友参考一下
    2013-04-04
  • C++ 指向类成员的指针

    C++ 指向类成员的指针

    指向类成员的指针总的来讲可以分为两大类四小类(指向数据成员还是成员函数,指向普通成员还是静态成员)
    2020-03-03

最新评论