正文

[转] 我能防止别人从我的类继承吗?2007-11-17 18:32:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lym51/31003.html

分享到:

  Q: 我能防止别人从我的类继承吗? A: 可以的,但何必呢?好吧,也许有两个理由: 出于效率考虑——不希望我的函数调用是虚的 出于安全考虑——确保我的类不被用作基类(这样我拷贝对象时就不用担心对象被切割(slicing)了)[译注:“对象切割”指,将派生类对象赋给基类变量时,根据C++的类型转换机制,只有包括在派生类中的基类部分被拷贝,其余部分被“切割”掉了。] 根据我的经验,“效率考虑”常常纯属多余。在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节)   原文地址:http://www.research.att.com/~bs/bs_faq2.html#no-derivation

阅读(2761) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册