设计一个类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012658346/article/details/52402715

1、设计一个不能被继承的类

  1)将构造函数设为私有
  此时子类不能访问基类的构造函数,因此创建子类时就会报错(无法访问private成员)
  

class Base_Uninherit{
private:
    Base_Uninherit(){}
    Base_Uninherit(const Base_Uninherit& rhs){}
    Base_Uninherit& operator=(const Base_Uninherit& rhs){   return *this; }
public:
    static Base_Uninherit* construct(){   //只能通过这种方式在堆上构造一个对象
        Base_Uninherit* pb=new Base_Uninherit();
        return pb;
    }       
    ~Base_Uninherit();
};

class Derived_Uninherit:public Base_Uninherit{

};

  这种情况下,虽然基类不能被继承,但是基类也不能在栈上初始化,只能通过类静态方法的形式在堆上创建一个对象。

2)利用友元类
  首先声明一个辅助的模板基类,将其构造函数设为私有,只有声明的友元类可以访问。则所有以FinalClass形式继承该基类的类都不能再被继承。并且FinalClass可以同时在堆和栈上创建。

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

class FinalClass:virtual public Base<FinalClass>{
public:
    FinalClass(){}
    ~FinalClass(){}
};

2、如何保证只能在堆上创建对象
将析构函数设为私有
C++是静态绑定语言,因此在编译期,所有的非虚函数都必须分析完成。即使是虚函数,也要检查可访问性。
当在栈上创建对象时,对象会自动析构,这就要求析构函数必须可以访问。
而在堆上创建对象时,析构的时机由程序员控制,因此不一定需要析构函数
因此当析构函数是私有的,如果在栈上创建对象,编译就会报错

3、如何保证只能在栈上创建对象
在堆上创建对象都是通过new操作符来实现的,因此禁用new操作符,将operator new设为私有的就可以保证不能在堆上创建对象

猜你喜欢

转载自blog.csdn.net/u012658346/article/details/52402715
今日推荐