C++ 不能被继承的类

  • 类只能在栈上创建

    因为在堆上创建对象需要调用new,所以将operator new设置为私有的即可

    //如何设计类只能建立在栈
    class Test
    {
    public:
        Test()
        {
            std::cout << "call construct function\n";
        }
    
        ~Test()
        {
            std::cout << "call destruction function\n";
        }
    
        void print_log()
        {
            std::cout << "call print log\n";
        }
    
        /**/
        //new 运算符是private,外部禁止调用  因此该类只能在栈上创建
        //重载了new运算符也需要重载delete运算符
    private:
    
        void* operator new(std::size_t count){}
    
        void* operator new[](std::size_t count){}
    
        void operator delete[]( void* ptr ){}
    
        void operator delete( void* ptr ){}
    };
    
    /*类的使用*/
    //无法访问 operate new或者new[]运算符
    //build error
    Test* parrStack = new Test[10];
    
    //build error
    Test* pStack = new Test;
    
    //build ok
    Test stack;
    stack.print_log();
    
    
  • 类只能在堆上创建

    1、将构造函数和析构函数设置成private属性
    2、创建public属性的两个函数分别new和delete两个函数,并且是static,因为需要通过类调用,不能直接使用private属性的·构造函数

    /*
       想要达到只能在堆上创建对象,其设计要求如下:
       1.该类的构造函数或者析构函数至少有一个是private属性
       2.提供一个创建对象接口,用于类内部创建堆对象
       3.提供堆对象销毁函数,这个非必须,需要看析构是否public属性
    */
    class Test
    {
    private:
        Test():m_data(0){}
        ~Test(){}
    
    public:
        static Test* CreateObj()
        {
            return new (std::nothrow) Test;
        }
    
        static void DestroyObj(Test* &pInstance)
        {
              if (NULL != pInstance)
              {
                  delete pInstance;
                  pInstance = NULL;
              }
        }
    
        int m_data;
    };
    
    //类的使用
    Test OnlyHeap;//build error
    
    Test* pOnlyHeap = Test::CreateObj();
    if (NULL != pOnlyHeap)
    {
        pOnlyHeap->m_data = 10;
    }
    
    //需要手动释放对象,否则内存泄漏,不易维护
    if (NULL != pOnlyHeap)
    {
        Test::DestroyObj(pOnlyHeap);
    }
    
    
  • 创建不能被继承的类

    将构造函数私有化

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值