博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用C++设计一个不能被继承的类
阅读量:6279 次
发布时间:2019-06-22

本文共 970 字,大约阅读时间需要 3 分钟。



在 C++ 中,子类的构造函数会自己主动调用父类的构造函数。相同,子类的析构函数也会自己主动调用父类的析构函数。要想一个类不能被继承,我们仅仅要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时候,必定会因为试图调用构造函数、析构函数而导致编译错误。  

template <typename T>

class A

{
     friend T;
     private:
     A() {}
     ~A() {}
};
class B : virtual public A<B>
{
      public:
      B() {}
      ~B() {}
};

类B使用起来和一般的类没有差别,能够在栈上、也能够在堆上创建实例。虽然类 A<B> 的构造函数和析构函数都是私有的,但因为类B是它的友元函数,因此在B中调用 A<B> 的构造函数和析构函数都不会造成编译错误。

但当我们试图从B 继承一个类并创建它的实例时,却不同通过编译。

class C : virtual public B
{
      public:
      C() {}
     ~C() {}
};

因为类 B 是从类 A  <B> 虚继承过来的,在调用 C的构造函数的时候,会直接跳过B而直接调用A<B> 的构造函数。很遗憾的是,C 不是 A <B> 的友元,因此不能调用其私有的构造函数。 

基于上面的分析,试图从 B 继承的类,一旦实例化,都会导致编译错误,因此是 B 不能被继承。这就满足了我们设计要求。

void main( void )
{
     B b;
    //C c;
    return;
}

还有还有一种思路,比如:

class TheOnlyInstance

{

publc:

     static TheOnlyInstance* GetTheOnlyInstance()

     {

            return new TheOnlyInstance;

     }

    static void ReleaseTheOnlyInstance(TheOnlyInstance* pInstance)

    {

         delete pInstance;

         pInstance = NULL;                  

    }

private:

    TheOnlyInstance(){}

     ~TheOnlyInstance(){}

}

这个类是不能被继承,可是我们仅仅能得到位于堆上的实例,得不到位于栈上的实例。

转载地址:http://enyva.baihongyu.com/

你可能感兴趣的文章
智能照明造福千家万户 家居智能不再是梦
查看>>
物联网如何跳出“看起来很美”?
查看>>
浅谈MySQL 数据库性能优化
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档
查看>>
灵动空间 创享生活
查看>>
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.6 UDP回射客户程序:dg_cli函数...
查看>>
不要将时间浪费到编写完美代码上
查看>>
《第一桶金怎么赚——淘宝开店创业致富一册通》一一第1章 创业梦想,怎样起步...
查看>>
基于容器服务的持续集成与云端交付(三)- 从零搭建持续交付系统
查看>>
《算法基础:打开算法之门》一3.4 归并排序
查看>>
高德开放平台开放源代码 鼓励开发者创新
查看>>
《高并发Oracle数据库系统的架构与设计》一2.5 索引维护
查看>>
《Exchange Server 2010 SP1/SP2管理实践》——2.4 部署外部网络环境
查看>>
Firefox 是 Pwn2own 2014 上攻陷次数最多的浏览器
查看>>
阿里感悟(十八)- 应届生Review
查看>>
《计算广告:互联网商业变现的市场与技术》一第一部分 在线广告市场与背景...
查看>>
话说模式匹配(5) for表达式中的模式匹配
查看>>
《锋利的SQL(第2版)》——1.7 常用函数
查看>>
《Arduino家居安全系统构建实战》——1.5 介绍用于机器学习的F
查看>>
jquery中hover()的用法。简单粗暴
查看>>