2012年2月28日星期二

转:关于c++中不能被继承类的实现


关于c++中不能被继承类的实现



-- 源于TopLanguage Groups,整理得之并分享。

template <typename T> 
class FinalClass 

        friend T; 
private: 
        FinalClass(); 
        ~FinalClass(); 
};
class anyOne : public virtual  FinalClass<anyOne> 

  ... 
}; 

C++ 标准规定:virtual base class 的构造函数是被 most derived class 直接(显式或隐式)调用的。如果有 
多个 virtual base 这些 virtual base 的相对构造顺序是沿继承体系从上到下,从左到右。 


看到这个议题,我回去也写了一个简单的类,代码如下: 
namespace FinalClass
{
        template< class T >
        class FinalClass
        {
        private:
                friend T;
                FinalClass(){};
                ~FinalClass(){};
        }; 
};
一共就那么几行代码,可是越看越别扭. 
1. 必须告诉 子类,你需要 virtual 继承.除了注释,没有任何办法告诉使用者加上virtual...... 
2. 这个类的析构函数需要加 virtual 么?如果加上virtual, 那么假设子类没有virtual函数,是不是增加了子类的无谓的负担? 
但是没加 virtual,又没有任何办法阻止类似 FinalClass* 这种指针的声明............. 

本意是要防止继承,但是写了这么简单的几行代码又引发出来了两个额外的问题. 到底值不值得那么写呢.  所以,最好的做法就是如 Shuo
chen 所说, // You are not allow to derive from this class !!!



模板要有调用才会实例化,你可以放到一个main里测试下,另外最好给finalclass加上virtual。如:
int main()
{
   test workingOrnot; 
   return 0;
}
在 2012年2月23日 下午1:35,K.L. <xxxk.l....@gmail.com>写道: 

> 这个不能work啊,
> class test : public anyOne {};
> 编译可以通过。
> On Feb 22, 10:25 pm, Baesky <baesky2...@gmail.com> wrote:
> > template <typename T>
> > class FinalClass
> > {
> >         friend T;
> > private:
> >         FinalClass();
> >         ~FinalClass();
> > };
> > class anyOne : public FinalClass<anyOne>
> > {
> >   ...
> > };
> > 我在网上找的资料普遍就是友元的做法,这是我根据网上的做法利用模板机制做的一个类似java中final语义的类,不知道有什么更好的方法么?

-- end --
    

没有评论:

发表评论