关于c++中不能被继承类的实现
-- 源于TopLanguage Groups,整理得之并分享。
template <typename T>
class FinalClass
{
friend T;
private:
FinalClass();
~FinalClass();
class FinalClass
{
friend T;
private:
FinalClass();
~FinalClass();
};
class anyOne : public virtual FinalClass<anyOne>
{
...
...
};
C++ 标准规定:virtual base class 的构造函数是被 most derived class 直接(显式或隐式)调用的。如果有
多个 virtual base 这些 virtual base 的相对构造顺序是沿继承体系从上到下,从左到右。
多个 virtual base 这些 virtual base 的相对构造顺序是沿继承体系从上到下,从左到右。
看到这个议题,我回去也写了一个简单的类,代码如下:
1. 必须告诉 子类,你需要 virtual 继承.除了注释,没有任何办法告诉使用者加上virtual......
2. 这个类的析构函数需要加 virtual 么?如果加上virtual, 那么假设子类没有virtual函数,是不是增加了子类的无谓的负担?
但是没加 virtual,又没有任何办法阻止类似 FinalClass* 这种指针的声明.............
namespace FinalClass
{
template< class T >
class FinalClass
{
private:
friend T;
FinalClass(){};
~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 !!!
chen 所说, // You are not allow to derive from this class !!!
模板要有调用才会实例化,你可以放到一个main里测试下,另外最好给finalclass加上virtual。如:
int main()
{
test workingOrnot;
{
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 --
> 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 --
没有评论:
发表评论