• (剑指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,暂不支持模板参数类型作为友元类型。

  • 相关阅读:
    .linearDrag on rigidbody / rigidbody2D in code?
    Unity5权威讲解+项目源码+MP4
    C#的扩展方法解说
    use crunch compression
    IIS服务命令
    使用批处理打开控制面板中的功能
    一次性在一个文件夹里建立多个文件夹
    bat 批处理切换到当前脚本所在文件夹
    %date~0,4%和 %time~0,2%等用法详解(转)
    DOS批处理高级教程(还不错)(转)
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4690754.html
Copyright © 2020-2023  润新知