实现一个不能被继承的特殊类。

  • 2022-07-15 20:49:31

1、实现一个不能被继承的类?

1、将类的构造函数设置为私有
2、在父类中给一个静态的函数构造对象

1)保证了父类的构造函数在子类中不可见,但是子类的构造函数是要调用父类
的构造函数合成。
2)此时出现一个问题,子类不能构造出对象,但是这个类也不能构造出对象了,因此提供一个静态的公有函数来构造对象

2、如何实现一个只能在堆上生成对象的类?
可在 上生成对象(father f)
上可生成对象
静态区定义一个全局对象(father f)

1、把构造函数设置成私有
2、给一个静态函数获取一个对象(对象的空间的new出来的)

漏洞-》有可能在外面构造了一个堆上生成的对象1,但是又用这个对象1拷贝构造了一个对象2,那么这个对象2就是在栈上生成的。

补丁-》把拷贝构造函数和赋值运算符的重载只声明不实现,并且声明为私有,就不会使用类里面默认的。

//实现一个只能在堆上生成对象的类
class father
{
    public:
        static father* GetObj()
        {
            return new father();
        }
    public:
        int num_;
    private:
        father()
        {};
        father(const int num_)
        {};
        father&operator=(const int&num_)
        {};
};

附加:类的防拷贝的实现
1、只声明不实现
2、声明为私有的

3、如何实现一个只能在栈上生成对象的类?

1、把构造函数设置成私有
2、提供一个静态的函数生成一个匿名对象

//实现一个只能在栈上生成对象的类
class father
{
    public:
        static father GetObj()
        {
            return father();
        }
    private:
        father();
    private:
        int _name;
};

int main()
{
    //father* ptr=father::GetObj();
    father f=father::GetObj();
    return 0;
}

猜你喜欢