IT入门 > 面试题 > python题库 > 剑指offer >

IT入门 > 面试题 > python题库 > 剑指offer >

048-不能被继承的类

  你会看到这个提示,那是因为你的系统无法识别某栏目的模型信息,或者你新建模型后,没为这个模型设计单独的模板。不同模型的文档浏览页的模板为:article_模型名字标识.htm 如“article_article.htm”,更多的信息你可以在频道模型管理的地方查看。
附加标题 内容:
模板调用标记:
题型:1单选,2多选,3填空,4问答,5排序 内容:
模板调用标记:
4
选项A 内容:
模板调用标记:
选项B 内容:
模板调用标记:
选项C 内容:
模板调用标记:
选项D 内容:
模板调用标记:
答案 内容:
模板调用标记:

设计一个不能被继承的类

#3 分析

首先想到的是在C++中, 子类的构造函数会自动调用父类的构造函数, 同样, 子类的析构函数也会自动调用父类的析构函数

要想一个类不能被继承, 我们只要把它的构造函数和析构函数都定义为私有函数.

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

class SealedClass
{
private :
    SealedClass( ){ }
    ~SealedClass( ){ };
};

可是这个类的构造函数和析构函数都是私有函数了, 我们怎样才能得到该类的实例呢

我们有很多种方法来实现类的创建

  • 定义静态函数或者静态变量来创建和释放类的实例

  • 友元函数可以访问类的私有成员

  • 友元类可以访问类的私有成员

#4 静态的创建和释放类的实例

##4.1 静态函数

#include <iostream>
using namespace std;


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

};

class Base : public SealedClass
{
};

int main( )
{
    SealedClass *pb = Base::GetInstance( );
    Base base;

    return 0;
}

##4.2 静态变量

#include <iostream>

using namespace std;


class SealedClass
{
public  :
    static SealedClass* GetInstance( )
    {
        if(m_sc == NULL)
        {
            m_sc = new SealedClass( );
        }

        return m_sc;
    }
    static void Destroy( )
    {
        if(m_sc != NULL)
        {
            delete m_sc;
        }
    }
private :
    SealedClass( ){ }
    ~SealedClass( ){ }


    static SealedClass  *m_sc;
};


SealedClass* SealedClass::m_sc = NULL;


class Base : public SealedClass
{
};


int main( )
{
    SealedClass *pb = SealedClass::GetInstance( );
    SealedClass::Destroy( );

    pb = NULL;

    //Base b;  //  error
    return 0;
}

#5 友元实现

##5.1 友元函数实现

#include <iostream>

using namespace std;


class SealedClass
{
private :
    SealedClass( ){ }
    ~SealedClass( ){ }

public  :
    friend SealedClass* GetInstance( );

};


SealedClass* GetInstance( )
{
    return new SealedClass( );
}


class Base : public SealedClass
{
};

int main( )
{
    SealedClass *p = GetInstance( );

    //Base base;    // error

    return 0;
}

##5.2 友元类实现

#include <iostream>
using namespace std;



class CNoHeritance
{
    friend class SealedClass;
private:
    CNoHeritance(){ }
    ~CNoHeritance(){ }
};



class SealedClass : virtual public CNoHeritance
{
public:
    SealedClass( ){ }

    ~SealedClass( ){ }
};


/*
class Base : public SealedClass
{
public:
    Base():SealedClass( ){ }
    ~Base(){ }
};
*/

int main( )
{
    SealedClass  sc;
    //Base base;

    return 0;
}

#6 总结

#include <iostream>
using namespace std;

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


class SealedClass : virtual public CNoHeritance<SealedClass>
{
public:
    SealedClass( ){ }

    ~SealedClass( ){ }
};

/*
class Base : public SealedClass
{
public:
    Base():SealedClass( ){ }
    ~Base(){ }
};
*/

int main( )
{
    SealedClass  sc;
    //Base base;

    return 0;
}
难度:1入门级,2初级,3中级,4高级 内容:
模板调用标记:
1,2,3,4
专业分类 内容:
模板调用标记:
(责任编辑:zengmumu)
    广告位API接口通信错误,查看德得广告获取帮助