(剑指Offer)面试题48:不能被继承的类

题目:

写一个不能被继承的类

思路:

1、把构造函数设为私有函数

在C++中子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的构造函数,要想一个类不能被继承,只要把它的构造函数和析构函数都定义为私有函数。

当一个类试图从它那继承的时候,必然会由于调用构造函数、析构函数而导致编译错误。

但如果构造函数 、析构函数都为私有函数,怎么得到该类型的实例呢?可以通过定义公有的静态函数来创建和释放类的实例。

这样我们只能得到位于堆上的实例,而得不到栈上的实例。

代码:

class SealedClass{
public:
    static SealedClass* GetInstance(){
        return new SealedClass();
    }

    static void DeleteInstance(SealedClass* pInstance){
        delete pInstance;
    }
private:
    SealedClass(){};
    ~SealedClass(){};
};

2、虚拟继承

先看代码:

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

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

class Try:public SealedClass{
public:
    Try(){};
    ~Try(){};
};

类SealedClass是从类MakeSealed<SealedClass>继承过来的,在调用Try的构造函数的时候,会跳过SealedClass而直接调用MakeSealed<SealedClass>的构造函数,

但Try不是它的友元类型,因此不能调用它的私有构造函数,因此会编译出错。

缺点:移植性不好,SealedClass在VS能够编译,但GCC对friend的要求不同于VS,暂不支持模板参数类型作为友元类型。

posted @ 2015-07-30 21:55  AndyJee  阅读(707)  评论(0编辑  收藏  举报