荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Dreamer (我与萤火虫), 信区: SoftDev
标  题: 【C++】[FAQ]我能防止别人从我的类继承吗?
发信站: 荔园晨风BBS站 (Thu Jun 10 13:48:19 2004), 站内信件


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






--
如果你真的爱萤火虫,你就不应该将她困在瓶子里;
如果你真的爱萤火虫,你应该放开她,让她在天空中自由自在地飞!
虽然你会不舍得她,但是最终你就会明白这样你才真正拥有了她!

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.223]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店