class anyOne : public FinalClass<anyOne>
{
...
};
我在网上找的资料普遍就是友元的做法,这是我根据网上的做法利用模板机制做的一个类似java中final语义的类,不知道有什么更好的方法么?
On Feb 23, 11:25 am, Baesky <baesky2...@gmail.com> wrote:
On Wed, Feb 22, 2012 at 07:57:00PM -0800, Shuo Chen wrote:
> User-Agent: G2/1.0
> Date: Wed, 22 Feb 2012 19:57:00 -0800 (PST)
> To: TopLanguage <pon...@googlegroups.com>
> From: Shuo Chen <gian...@gmail.com>
> Subject: [TL] Re: 关于c++中不能被继承类的实现
--
On Wed, Feb 22, 2012 at 07:57:00PM -0800, Shuo Chen wrote:
> User-Agent: G2/1.0
> Date: Wed, 22 Feb 2012 19:57:00 -0800 (PST)
> To: TopLanguage <pon...@googlegroups.com>
> From: Shuo Chen <gian...@gmail.com>
> Subject: [TL] Re: 关于c++中不能被继承类的实现
>
--
On Feb 23, 1:00 pm, jinhu wang <wangjinhu...@gmail.com> wrote:
> 这跟幽默有啥关系,我觉得可以讨论一下,c++里面那些多余的语法及关键字。
>
> 在 2012年2月23日 下午12:47,Li Ferdinand <baesky2...@gmail.com>写道:
>
>
>
>
>
>
>
> > 你可太幽默了,呵呵。
>
};
On 2月23日, 下午7时48分, Li Ferdinand <baesky2...@gmail.com> wrote:
> 我在vs2005下,不加vitual也可以。
>
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 !!!
On Feb 24, 10:27 pm, Xiang Wang <xiang_w...@trendmicro.com.cn> wrote:
> *其实我想说,*
> *
> *
> *如果基类的构造函数是私有的,不久实现了?
> *
> 2012/2/24 Li Ferdinand <baesky2...@gmail.com>
On Feb 26, 11:03 am, co <cui...@gmail.com> wrote:
> C++ offers no derivation-prevention mechanism akin to Java's final classes
> or C#'s sealed classes。STL container types 都没有virtual
> 的destructor,如果继承了,后面又用一个基类指针delete子类对象,就会产生错误。所以,如果一个类没有virtual的destructor, 还是不要继承的好。
>
> 在 2012年2月25日 下午9:39,K.L. <xxxK.L....@gmail.com>写道:
>
>
>
>
>
>
>
> > Java里的final
> > class是不是防止包内的代码被包装后再次发布?我想不出什么设计上的动机来阻止类被继承。如果是为了版权限制,不管怎么做在C++中都没意义,C++的代码 太容易被hack了。
>
> > 在 2012年2月24日星期五UTC+8下午4时08分11秒,Marmot写道:
>
> >> 看到这个议题,我回去也写了一个简单的类,代码如下:
>
> >> 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 !!!
>
> > 在 2012年2月24日星期五UTC+8下午4时08分11秒,Marmot写道:
>
> >> 看到这个议题,我回去也写了一个简单的类,代码如下:
>
> >> namespace FinalClass
> >> {
> >> template< class T >
> >> class FinalClass
> >> {
> >> private:
> >> friend T;
> >> FinalClass(){}**;
> >> ~FinalClass(){};
> >> };
> >> };
>
> >> 一共就那么几行代码,可是越看越别扭.
> >> 1. 必须告诉 子类,你需要 virtual 继承.除了注释,没有任何办法告诉使用者加上virtual..**....
> >> 2. 这个类的析构函数需要加 virtual 么?如果加上virtual, 那么假设子类没有virtual函数,**是不是增加了子类的无谓的负担?
> >> 但是没加 virtual,又没有任何办法阻止类似 FinalClass* 这种指针的声明.............
>
> >> 本意是要防止继承,**但是写了这么简单的几行代码又引发出来了两个额外的问题. 到底值不值得那么写呢. 所以,最好的做法就是如 Shuo
On Feb 26, 12:35 pm, Xiang Wang <xiang_w...@trendmicro.com.cn> wrote:
> *
> #include <iostream>
>
> using namespace std;
>
> class A
> {
> public:
> static A* f()
> {
> return new A;
> }
> private:
> A()
> {
> cout<<"construct"<<endl;
> }
> A( A& )
> {}};
>
> class B:public A
> {
> public:
> B(A & a):A(a)
> {
> cout<<"B constrcut"<<endl;
> }};
>
> int main()
> {
> B b();
> return 0;
>
> }
>
> 给个static接口调不就可以了。
> *
> 2012/2/25 Shuo Chen <giantc...@gmail.com>
On Feb 26, 11:25 am, xpolife <xpol...@gmail.com> wrote:
> 以前公司产品代码里有一个gui类继承自std::vector......
>
> xpol
OT一下。这个例子让我想到了美国人开车,美国所有的岔路口, 都会有一个"STOP"的标志,
提示司机到此处要停车后观察其他路上没有距离比较近 的车行驶后再启动并拐弯,
而且我从没看到过哪个路口装有监控摄像头,但是所有的车都会在STOP标志前停一下,
并不只是减速,而是真的将车停下,观察其他车道过后再加速,一开始我很奇怪
路上的就一辆车,又是在乡村这种几公里内都看不到人的地方,为什么还要遵守这些小规矩.
后来才知道,在美国违反法律的结果是非常麻烦的,也听人说过无照驾驶与谋杀是同
一级的罪名。如果说酒后驾车又撞到人,可能人并没有什么大事,但是根据法律,
你就要付全责,受害人可以要求你支付所有的医疗费,美国的医疗费
是非常的高,通常是由保险公司帮你cover一大部分,个人很少有完全自己承担的,
如果惹上官司,那就更麻烦,受害人可以告你一辈子。
我想说的是,如果类作者注释里明确说明了不要直接继承此类,那就最好不要那么做,
如果你不遵守,那所有因此引起的后果都要你自己来承担。并不是只有写在语法里的才叫规矩,
程序员的注释也是代码的一部分,你就应该像遵守法律一样遵守它所说的。
--
这种努力有时候是有价值的,但是必然会带来一些副作用.但是想完全弄清楚所有的副作用又很难,毕竟C++提供那么多的特性,功能那么强大,甚至各种编译
器都不能提供统一的实现. 所以,我的结论是, 防止继承,简单的注释更加高效.
On Mon, Feb 27, 2012 at 10:05:13AM +0800, Xiang Wang wrote:
> Date: Mon, 27 Feb 2012 10:05:13 +0800
> To: pon...@googlegroups.com
> From: Xiang Wang <xiang...@trendmicro.com.cn>
> Subject: Re: [TL] 关于c++中不能被继承类的实现
>
> 怎么, 回答的好?
> 我看这个thread就没 的comments. 有资 这么跟我说?
> 2012/2/27 OxFAN <[1]oday...@gmail.com>
>
> 小题目 回答的很好么,问题没讨论多少,倒是
> 学会阴阳怪气的说话了
>
> 2012/2/26 Xiang Wang <[2]xiang...@trendmicro.com.cn>
>
> 一个小题目, 也有如此大论,怎么不去做叫 ?
> 2012/2/26 Ryan Feng <[3]oday...@gmail.com>
>
> On Sun, Feb 26, 2012 at 03:21:48PM +0800, Li Ferdinand wrote:
> > Date: Sun, 26 Feb 2012 15:21:48 +0800
> > To: TopLanguage <[4]pon...@googlegroups.com>
> > From: Li Ferdinand <[5]baesk...@gmail.com>
> > Subject: Re: [TL] 于c++中不能被继承类的实现
> >
> > 实 要说非得用友
> 么?当然不见得,达到一个目的的手段很多.
> > 当我们脱离实 应用单纯去讨论一个技术或
> 一个trick时候,我觉得就显得很没有 要,
> 为一切技术都要被使用,被利用,才是有用的技术.一项技术单纯脱离上下文来讨论,那么只能是一千个人脑子里有一千个哈姆雷特了.
> > 有的朋友说用注释,我为什么反对?
> 为注释这种东西,不能给人任何硬性规定.我想用语法机制上去强制客户
> 法使用这个继承,单纯用注释,我个人觉得是非常不妥的.举个例子,路边写个告示"禁制
> 驾",
> 觉得有用么?总会有人对自己太有把握,觉得违背这个告示应该没什么,一切都在自我掌控之中.
> > 友 的臭名昭著在网上
> 乎与goto并驾齐驱了,但是我在这里想为他们说句话:他们不是天生凶神恶
> ,只是我们的滥用或
> 不合理使用,让他们背负了罪名.在某写特殊
> 况,他们并不是恶魔,使用他们并不代表着恶劣或
> 拙劣的设计.他们更像是c++语法世界的边缘,很多人在尝试走的时候掉了下去,而我们不能
> 此就放弃领略悬崖边的风景.
>
> OT一下。这个例子让我想到了美国人开车,美国所有的岔路口,
> 都会有一个"STOP"的 志,
> 提示司机到此处要停车后观察
> 他路上没有距离比较近 的车行驶后再启动并拐弯,
> 而且我从没看到过哪个路口
> 有监控摄像头,但是所有的车都会在STOP
> 志前停一下,
> 并不只是减速,而是真的将车停下,观察
> 他车道过后再 速,一开始我很奇怪
> 路上的就一辆车,又是在乡村这种 里
> 都看不到人的地方,为什么还要遵守这些小规矩.
> 后来才知道,在美国违反法律的结果是非常麻烦的,也听人说过
> 驾驶与谋杀是同
> 一级的罪名。如果说
> 后驾车又撞到人,可能人并没有什么大事,但是
> 据法律,
> 就要付 责,受害人可以要求
> 支付所有的医疗费,美国的医疗费
> 是非常的高,通常是由保险 司帮
> cover一大部分,个人很少有完 自己承 的,
> 如果惹上官司,那就更麻烦,受害人可以告
> 一辈子。
>
> 我想说的是,如果类作
> 注释里明确说明了不要直接继承此类,那就最好不要那么做,
> 如果 不遵守,那所有 此引起的后果都要
> 自己来承 。并不是只有写在语法里的才叫规矩,
> 程序员的注释也是代 的一部分,
> 就应该像遵守法律一 遵守它所说的。
> --
>
> References
>
> Visible links
> 1. mailto:oday...@gmail.com
> 2. mailto:xiang...@trendmicro.com.cn
> 3. mailto:oday...@gmail.com
> 4. mailto:pon...@googlegroups.com
> 5. mailto:baesk...@gmail.com
--
On 2/28/12, achilleus liu <sanach...@gmail.com> wrote:
> 弱弱得问一句:
> friend T 这一行代码你们怎么编译过的?
> 我用g++ 4.4 和 g++ 4.6 -std=c++0x 都编译不过
>
> 在 2012年2月28日 下午3:06,Hook <hoo...@gmail.com>写道:
>
>> 请不要把外面论坛的风气带到这里来。耻于有你这种腔调的人存在这个组里。
>>
>>
>> 2012/2/27 Xiang Wang <xiang...@trendmicro.com.cn>
>>
>>> *怎么,你回答的好?*
>>> *
>>> *
>>> *我看这个thread就没你的comments.你有资格这么跟我说?
>>> *
>>>
>>> 2012/2/27 OxFAN <oday...@gmail.com>
>>>
>>>> 小题目你回答的很好么,问题没讨论多少,倒是先学会阴阳怪气的说话了
>>>>
>>>>
>>>> 2012/2/26 Xiang Wang <xiang...@trendmicro.com.cn>
>>>>
>>>>> *一个小题目,你也有如此大论,怎么不去做叫兽?
>>>>> *
更好的办法是写一行注释:
// You are not allow to derive from this class !!!