面试题:用C++实现一个不能被继承的类

剑指offer面试题:用C++实现一个不能被继承的类

因为子类继承父类,子类的构造函数和析构函数会调用父类的构造,
解决问题的方法就是,不允许子类的构造函数调用父类的构造与析构。
--------------------------------------------------------------------
将父类的构造函数和析构函数设置为private成员函数,私有成员只能被自身的类访问。
//sealed是C#中的一个关键字,主要是用来表示一个不能被继承的类

1.
clasa SealedClass
{
public:
    static SealedClass* getInstance()
    {
        return new SealedClass();
    }
    static void Delete(SealedClass* p)
    {
        delete p;
    }
    
private:
    SealedClass()       //将构造函数和析构函数设为私有
    {}
    ~SealedClass()
    {}
};

 
 
SealedClass类不能被访问,因为它的构造函数和析构函数定义为private成员,但是如果类SealedClass定义它的实例时会发生错误,怎样才能的到该类型的实例呢?我们可以通过公有的静态函数和创建和释放该类的实例,即上述的 static SealedClass* getInstance()和 static void Delete(SealedClass* p)函数。该方法的缺点:该类的实例只能在堆上创建与我们常见的类的构造与析构不同
2.虚函数
//有一个缺陷,在vs里支持友元,GCC下不支持模板参数作为友元
template <typename T>
class MakeSealed
{
    friend T;

private:
    MakeSealed()
    {}
    ~MakeSealed()
    {}
};

class SealedClass : virtual public MakeSealed
{
public:
    SealedClass()
    {}
    ~SealedClass()
    {}
};

//
int main()
{
    SealedClass* a=Sealedclass::getInstance();
    return 0;
}

 
此方法的优点:
类的实例既可以在堆上创建,又可以在栈上创建;
更符合类的表示

相关面试题

1.实现一个只能在栈上生成对象的类。
2.实现一个只能在堆上生成对象的类。

猜你喜欢

转载自blog.csdn.net/qq_40840459/article/details/80078999