创建一个不能被继承的类和只能在堆上(或栈上)创建对象

创建一个不能被继承的类

法一:
要创建一个不能被继承的类,我们容易想到的方法是:将构造函数私有化,重新编写create()函数,创建对象,同时为了对称可以将析构函数也私有化,重新编写destory()。

class Base
{
public:
    static Base* Create(int b)
    {
        Base* ba = new Base;
        ba->_b = b;
        return ba;
    }
    static void Destory(Base* ba)
    {
        delete ba;
        ba = NULL;
    }
private:
    Base()
    {}
    ~Base()
    {}
public:
    int _b;
};
void ForFun()
{
    Base* ba = Base::Create(2);
    cout<<ba->_b<<endl;
    Base::Destory(ba);
}

Base可以被调用。显示打印2
定义一个类,继承Base。

class Better:public Base
{
public:
    Better()
    {}
    ~Better()
    {}
};
void ForFun()
{
    Better bt;
    Better* bt2 = new Better;
}

这里写图片描述
对于这种方法,父类创建对象只能在堆上创建,不能在栈上创建。
法二:
(1)在基类中定义一个友元类,设置为模板(模板为子类);
(2)将构造函数与析构函数设置为私有;
(3)子类虚拟继承父类;
(4)调用子类创建对象,可以在堆上或栈上创建对象;
(5)定义子类2继承子类,该子类2不能创建对象。

这里写图片描述
不能被继承的类是—>Better。

static Base* Create(int b)
    {
        Base* ba = new Base;
        ba->_b = b;
        return ba;
    }
    static void Destory(Base* ba)
    {
        delete ba;
        ba = NULL;
    }
private:
    Base()
    {}
    ~Base()
    {}
public:
    int _b;
};
class Better:virtual public Base<Better>
{
public:
    Better()
    {}
    ~Better()
    {}
};
class Final:public Better
{
public:
    Final()
    {}
    ~Final()
    {}
};
void ForFun()
{
    Better *b = new Better; //堆上对象
    Better bt; //栈上对象
}

只能在堆上创建对象

动态建立:使用new运算符将对象建立在对空间中。
A* a = new A;

执行过程:
(1)执行operator new()函数,在堆空间中搜索合适的内存并进行分配;
(2)调用构造函数构造对象,并初始化内存空间。

法一:将构造函数设为私有。
确实不能在栈上创建对象了,但同时也不能再堆上创建对象了。
不可取。

这里写图片描述
法二:将析构函数设为私有,编写destory()函数释放空间。
问题:该类同时无法作为基类被继承。
解决方法:
(1)将析构函数设为virtual(虚函数),在子类中重写析构函数。
(2)将析构函数设为protected,类外无法访问,但子类可以访问。

可以在堆上创建空间:
这里写图片描述

不能在栈上创建空间:
这里写图片描述
法三:将构造函数与析构函数设为protected,编写create()和destory()。
可以使用函数来进行创建与删除。

只能在栈上创建对象

由编译器为对象在栈上分配内存空间。

执行步骤:直接调用构造函数。
因为在堆上创建对象需要调用new,所以讲operator new设置为私有的即可。
这里写图片描述
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值