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

  • 相关阅读:
    nanoPI kernel compile record
    Golang go get第三方库的坑
    Python解析Linux命令行
    Linux:dd命令
    Golang异常处理
    Golang自定义包导入
    Golang覆盖写入文件的小坑
    Golang数据类型总结及其转换
    ASP.NET学习之页面传值(8)_Application传值
    ASP.NET学习之页面传值(7)_Cookie传值
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4690754.html
Copyright © 2011-2022 走看看