C++:1.设计一个类不能被继承 2.设计一个类只能在堆上创建对象。 3.设计一个类只能在栈上创建对象。

C++作为第一代面向对象语言,在设计时,并没有像java那样设计出final class,但是经常会有人问到,如何用C++实现一个最终类,其实说句真心话,我也挺烦这种问题的,实用性又不强,何必如此钻牛角尖呢?但是这个问题,又可以很好的考验你对C++继承这里知识点的掌握情况,不是嘛。
那么我们现在讨论一下:

C++如何设计一个最终类——不可被继承

C++中继承分为三种方式:public、private、protected三种方式,在任何继承中,被继承类的private成员不可被继承,那这个思路,会不会就是我们解决本题的思路呢?答案是,就是这样的。但是新问题又来了,如果把析构函数、构造函数放在私有成员中,那么自己也无法直接调用,只可以通过封装一个新的方法,来实现自己的调用。具体的我们通过下面的代码进行讲解,

#include<iostream>
using namespace std;

template<typename T> 
class A
{
    friend T;
private:
    A() {}
    ~A() {}
};

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

int main()
{
    B b;
    //C c;
    system("pause");
    return 0;
}

这个类使用起来和一般的类没有区别,可以在栈上、也可以在堆上创建实例。尽管类A的构造函数和析构函数都是私有的,但由于类B是它的友元函数,因此在B中调用A的构造函数和析构函数都不会造成编译错误。
注意:
C++11中已经有了final关键字:它的作用是指定类的虚函数不能被该类的继承类重写(override),或者是指定一个类成为一个不能被继承的类(final class)。

C++设计一个类只能在堆上创建对象

正常情况下,C++可以在栈和堆上创建对象,不过现在强制性要求只能在堆上创建,即用new创建新的对象,具体该怎么实现呢?

容易想到将构造函数设为私有。在构造函数私有之后,无法在类外部调用构造函数来构造类对象,只能使用new运算符来建立对象。然而,前面已经说过,new运算符的执行过程分为两步,C++提供new运算符的重载,其实是只允许重载operator
new()函数,而operator()函数用于分配内存,无法提供构造功能。因此,这种方法不可以。

当对象建立在栈上面时,是由编译器分配内存空间的,调用构造函数来构造栈对象。当对象使用完后,编译器会调用析构函数来释放栈对象所占的空间。编译器管理了对象的整个生命周期。如果编译器无法调用类的析构函数,情况会是怎样的呢?比如,类的析构函数是私有的,编译器无法调用析构函数来释放内存。所以,编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。


class A  
{ 
 protected: 
     A(){}  
     ~A(){}  
 public:  
     static A* create()  
     {  
          return new A();  
     }  
    void destory()  
    {  
        delete this;  
    }  
};  

设计一个类只能在栈上创建对象。

只有使用new运算符,对象才会建立在堆上,因此,只要禁用new运算符就可以实现类对象只能建立在栈上。将operator new()设为私有即可。代码如下:

class A  
{  
 private :  
    void* operator new (size_t t){} // 注意函数的第一个参数和返回值都是固定的
    void operator delete(void* ptr){}// 重载了new就需要重载delete
 public:  
    A(){}  
    ~A(){}  
}; 

这当问题的解决思路,就是建立在C++类封装、继承、多态三大特性上,还有具体的实现过程。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值