防止类继承,摘自Bjarne的faq(紫云英译)

原创 2005年03月01日 14:07:00

Q11: 我能防止别人从我的类继承吗?<?XML:NAMESPACE PREFIX = O />

A11: 可以的,但何必呢?好吧,也许有两个理由:

出于效率考虑——不希望我的函数调用是虚的

出于安全考虑——确保我的类不被用作基类(这样我拷贝对象时就不用担心对象被切割(slicing)了)

根据我的经验,“效率考虑”常常纯属多余。在C++中,虚函数调用如此之快,和普通函数调用并没有太多的区别。请注意,只有通过指针或者引用调用时才会启用虚拟机制;如果你指名道姓地调用一个对象,C++编译器会自动优化,去除任何的额外开销。

如果为了和“虚函数调用”说byebye,那么确实有给类继承体系“封顶”的需要。在设计前,不访先问问自己,这些函数为何要被设计成虚的。我确实见过这样的例子:性能要求苛刻的函数被设计成虚的,仅仅因为“我们习惯这样做”!

好了,无论如何,说了那么多,毕竟你只是想知道,为了某种合理的理由,你能不能防止别人继承你的类。答案是可以的。可惜,这里给出的解决之道不够干净利落。你不得不在在你的“封顶类”中虚拟继承一个无法构造的辅助基类。还是让例子来告诉我们一切吧:

     class Usable;

     class Usable_lock {
     friend class Usable;
     private:
          Usable_lock() {}
          Usable_lock(const Usable_lock&) {}
     };
       
     class Usable : public virtual Usable_lock {
     // ...
     public:
          Usable();
          Usable(char*);
         // ...
     };
       
     Usable a;
       
     class DD : public Usable { };
       
     DD dd;  // error: DD::DD() cannot access
          // Usable_lock::Usable_lock(): private member 

(参见《The Design and Evolution of C++》,11.4.3节)

英译三字经

人之初:At the begining of life性本善:Sex is good性相近:Basically,all the sex are same习相远:But it depends on ho...
  • t0nsha
  • t0nsha
  • 2006年12月17日 14:45
  • 1471

Bjarne Stroustrup's FAQ

翻译:叶丰原网页见:http://www.c-view.org/journal/008/bs_faq.htm#IDABXKNC这些是人们经常问我的一些问题。如果你有更好的问题,或者想对解答作一些评论,...
  • elmar
  • elmar
  • 2004年12月22日 20:34
  • 2347

Bjarne Stroustrup's FAQ(中文版)

http://www.stroustrup.com/bsfaqcn.html
  • apengg
  • apengg
  • 2017年12月09日 17:46
  • 50

C++之父Bjarne谈C++的未来发展

富有活力的语言需要不断改变和成长,C++也不例外。在本文中,Bjarne Stroustrup提出了自己对C++的设计和演化的看法。  为了让编译器、工具和类库实现者跟上节奏,让用户吸收标准C++所支...
  • fxpopboy
  • fxpopboy
  • 2007年01月11日 19:22
  • 462

什么是FAQ,它有何作用

FAQ就是Frequently Asked Questions(常见问题), 由于这些问题出现的比较普遍,一般都推荐用户先看看FAQ, 看自己的问题是否符合FAQ中的情况,如果符合的话FAQ中 ...
  • q1054261752
  • q1054261752
  • 2015年12月25日 16:45
  • 357

Bjarne Stroustrup博士对C++的看法

Bjarne Stroustrup博士,1950年出生于丹麦,先后毕业于丹麦阿鲁斯大学和英国剑桥大学,AT&T大规模程序设计研究部门负责 人, AT&T、贝尔实验室和ACM成员。1979年,B. S开...
  • livahu
  • livahu
  • 2006年11月23日 18:56
  • 732

数据库学习FAQ

数据库学习FAQ 简述数据、数据库、数据库管理系统、数据库系统的含义及其联系?数据:数据是信息的符号记录。数据是数据库处理和研究的对象 数据库:长期存储在计算机内,有组织、可共享的数据集合。数据按一定...
  • pupilxmk
  • pupilxmk
  • 2016年05月25日 08:59
  • 489

运维路上的FAQ

遇到的看见的,长期更新~~~ 1.linux乱码问题     [root@vps software]# vi  /etc/sysconfig/i18n     LANG='zh_...
  • u010718976
  • u010718976
  • 2017年01月10日 11:00
  • 207

FAQ = Fuck you?

剛才在看Denyhosts的FAQ的時候忽然想到FAQ的讀音跟fuck you似乎是一樣的?證明發下∵    F:[f]       A:[ʌ]       Q:[kju:]∴    FAQ=[fʌk...
  • hodrag
  • hodrag
  • 2009年04月22日 08:24
  • 2196

中国历史朝代 英文翻译 A Brief Chinese Chronology

夏Xia DynastyC.2100-C.1600 B.C.商Shang DynastyC.1600-C.1100 B.C.周Zhou Dynasty-西周Western Zhou DynastyC....
  • zubin006
  • zubin006
  • 2008年09月12日 09:16
  • 2479
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:防止类继承,摘自Bjarne的faq(紫云英译)
举报原因:
原因补充:

(最多只允许输入30个字)