正文

[转] 我能防止别人从我的类继承吗?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

阅读(2641) | 评论(0)


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

评论

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