SetForegroundWindow 及类保护
2006-07-20 11:43:51 来源:WEB开发网Asha Udupa
在C#中,有一个关键字正好是你想要的: sealed。当你的C#类被限定为 sealed 类型,相当于你告诉编译器无人能从这个类派生其它类。 例如, sealed class MyClass { ... }
意思是说没有人能从 MyClass 派生出别的类。在.NET Framework中许多(一些人说太多)类自身是密封的。
但你的问题的是 C++,而不是C#。啊哈,C++中可没有 sealed 这个关键字(至少现在还没有——我得到消息它不久将被加入到官方标准中)。但有一个相当简单的方法完成同一个目的 。只要你把构造函数申明为 private 即可: class MyClass {
这样便没有办法从 MyClass 派生新类。因为没法实例化它。等一等——如果没法实例化你的类。那别人如何使用它呢?问得好。答案是你必须添加静态函数 来创建类的实例。
private:
MyClass() { ... }
MyClass(int arg) { ... }
};class MyClass {
现在任何人可以调用 MyClass::CreateInstance 来创建你的类的实例,但没有人能从它派生。这种方法在大多情况下工作得很好,可它有一个 缺点:你很难在堆栈中创建 MyClass 实例。要解决这个问题,你需要一个稍微复杂的解决方案:
public:
static MyClass* CreateInstance() {
return new MyClass();
}
private:
MyClass() { }
};class MakeSealed {
现在除了 MakeSealed 的友元类 MyClass 以外,无人能创建 MakeSealed 实例。你能在堆栈中创建 MyClass 的实例 ,但你不能从MyClass 派生。你可以使用 MakeSealed 来使其它成为密封类,但同时必须添加它们为友元。MyClass 以 MakeSealed 为虚拟基类 ,以便于你在使用多重继承时不会出现问题。相当聪明,不是们吗?编程快乐!
private:
MakeSealed () { }
friend class MyClass;
};
class MyClass : virtual MakeSealed { };
Tags:SetForegroundWindow 保护
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接