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

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

Q11: 我能防止别人从我的类继承吗?

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节)

相关文章推荐

Bjarne Stroustrup的FAQ

  • 2008年10月22日 21:00
  • 397KB
  • 下载

译自five popular myths about c++ --by Bjarne Stroustrup (1)

原文:https://isocpp.org/blog/2014/12/five-popular-myths-about-c-bjarne-stroustrup Myth 1: "To understa...

国庆学WP7系列第三季--Windows Phone 7 Series Developer General FAQ(译)

转自:http://www.devdiv.com/forum.php?mod=viewthread&tid=34367&fromuid=74503   转自 WPWIND 前后台中的应用程序进程...

为什么使用googletest,而不是其他C++测试框架(译自google faq的该问题)

首先要说清楚,我们不希望陷入“哪个C++测试框架最好”的辩论中。现在有许多不错的C++测试框架,各自拥有大量的开发者和用户。我们不认为存在一个最好的框架,你只是必须为特定的任务选择正确的工具。   ...

C++ FAQ学习笔记 25章 继承 — 多继承和虚继承

等待中

C++11 FAQ中文版:类成员的内部初始化

三1 Year 2011陈 良乔C++11 FAQ 类内部成员的初始化 在C++98标准里,只有static const声明的整型成员能在类内部初始化,并且初始化值必须是常量表达式。这些限制...
  • fjb2080
  • fjb2080
  • 2012年05月02日 11:34
  • 6891

Newsgroup18828文本分类器、文本聚类器、关联分析频繁模式挖掘算法的Java实现工程下载及运行FAQ

Newsgroup18828文本分类器、文本聚类器、关联分析频繁模式挖掘算法的Java实现系列5篇博文自发表半年多来,累计浏览量近万次,Eclipse工程下载累计近千次,受到了很多朋友的关注,如果能给...

C++11 FAQ中文版:枚举类——具有类域和强类型的枚举

二23 Year 2011陈 良乔C++11 FAQ 枚举类——具有类域和强类型的枚举 枚举类(“新的枚举”,“强类型的枚举”)主要用来解决传统的C++枚举的三个问题: 可转换的枚举类型默认被转换...

C++11 FAQ中文版:继承的构造函数

三2 Year 2011陈 良乔C++11 FAQ 继承的构造函数 人们有时会对类成员函数或成员变量的作用域问题感到困惑,尤其是,当基类与派生类的同名成员不在同一个作用域内时: struc...
  • fjb2080
  • fjb2080
  • 2012年05月02日 11:45
  • 2510
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:防止类继承,摘自Bjarne的faq(紫云英译)
举报原因:
原因补充:

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