码迷,mamicode.com
首页 > 编程语言 > 详细

剑指offer (48) c++实现一个不能被继承的类

时间:2014-07-10 00:20:08      阅读:357      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   strong   cti   

题目:用c++实现一个不能被继承的类

 

题解分析:

 

常规解法:

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

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

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

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

这难不倒我们,我们可以通过定义静态函数来创建和释放类的实例。基于这个思路,我们可以写出如下的代码:

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

        static void DelInstance(FinalClass* pInstance) {
            delete pInstance;
            pInstance = NULL;
        }

    private:
        FinalClass() { }
        ~FinalClass() { }
};

这个类是不能被继承,但是有如下缺点:

1. 需要一个static public member function来创建一个实例

2. 类如果有多个构造函数,所有的构造函数都需要有一个相应的 static-public-member function

3. 类实例对象只能创建在堆上,不能在栈上

 

新奇解法:

class Final; // Forward declaration
class FinalLocker {
    public:
        friend class Final;
    private:
        FinalLocker();
        ~FinalLocker();
};

class Final : public virtual FinalLocker {
    public:
        Final();
        ~Final();
};

 

Final objFinal;    //OK - no problem
Derived objDer;   // Error! - Cant access FinalLocker‘s c‘tor

 

FinalLocker类将其所有ctor和dtor设为private

Final被设为为FinalLocker的friend,这样Final就可以访问 FinalLocker的所有member function,包括private的

Final虚继承FinalLocker,而FinalLocker的ctor和dtor都是private的,我们仍然可以创建Final的实例,堆上栈上都可以,因为Final是FinalLocker的friend

当Derived试图继承Final时,Derived的构造函数必须调用 FinalLocker的构造函数,而FinalLocker的构造函数是private的,所有编译器出错

这是因为 Derived不是FinalLocker的friend,记住 friend关系不是顺沿继承的,Final是 FinalLcker的friend,Derived不一定是,除非显式声明

 

相关资料:

http://prashanth-cpp.blogspot.com/2007/01/implementing-final-class-in-c.html

http://www.stroustrup.com/bs_faq2.html#no-derivation

 

扩展:c++11新添了 final 和 override关键字

final关键字有两个作用:

1. 禁止一个类被继承

class Base final {
    ...
};

class Derived : public Base {    // error,不能从final类继承
    ...
};

 

 

2. 禁止虚函数被重定义,仅限于虚函数

class Base  {
    virtual void func() final;
};

class Derived : public Base {
    virtual void func();    // error,不能重定义基类的final虚函数
};

 

剑指offer (48) c++实现一个不能被继承的类,布布扣,bubuko.com

剑指offer (48) c++实现一个不能被继承的类

标签:style   blog   http   color   strong   cti   

原文地址:http://www.cnblogs.com/wwwjieo0/p/3812342.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!