欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 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;
}