为什么要阻止一个类被继承?“为了安全考虑,比如说不想出现切割赋值的情况。”到底哪种情况下需要为这种安全做考虑?不太明白,请知道的朋友跟贴。
疑问先放这儿,问题怎么解决?我起先想法是让类的构造函数私有,用友元函数去创建对象。别的类如果从它派生,定义对象时就会因为访问不了基类的构造函数而失败。但这是个什么样的类啊。。。我汗。。。
Stroustrup的答案,如下:
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*);
// ...
};
原理:给它添加一个不含任何数据成员的虚拟基类,,可能的构造函数都设为私有。将这个类声明为基类的友元类。因为虚拟基类的构造函数都需要在最外围的类构造函数中被调用,所以如果别的类从这个类派生,定义对象时将会因为无法访问这个类的虚拟基类的构造函数而失败。
如果你以后想给你的类“封顶”,就这么做,给它一个这个造型的虚拟基类。
疑问先放这儿,问题怎么解决?我起先想法是让类的构造函数私有,用友元函数去创建对象。别的类如果从它派生,定义对象时就会因为访问不了基类的构造函数而失败。但这是个什么样的类啊。。。我汗。。。
Stroustrup的答案,如下:
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*);
// ...
};
原理:给它添加一个不含任何数据成员的虚拟基类,,可能的构造函数都设为私有。将这个类声明为基类的友元类。因为虚拟基类的构造函数都需要在最外围的类构造函数中被调用,所以如果别的类从这个类派生,定义对象时将会因为无法访问这个类的虚拟基类的构造函数而失败。
如果你以后想给你的类“封顶”,就这么做,给它一个这个造型的虚拟基类。