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

  • 相关阅读:
    Kubernetes对象之Pod
    docker&k8s填坑记
    kubernetes安装过程中遇到问题及解决
    深入JVM-垃圾回收概念与算法
    深入JVM-常用Java虚拟机参数
    深入JVM-java虚拟机的基本结构
    从Paxos到ZooKeeper-三、ZooKeeper的典型应用场景
    从Paxos到ZooKeeper-二、ZooKeeper和Paxos
    从Paxos到ZooKeeper-一、分布式架构
    java编程思想-java中的并发(四)
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4690754.html
Copyright © 2011-2022 走看看