有时候我们希望一个类不能被别的类继承,这种类称为final类,在C++11标准之前要实现这种技术,需要巧妙地利用一些细节。
如何使得一个类不能被继承但又不影响该类的使用呢?这里的方法我们需要用到多级继承技巧。首先我们要明确以下几点:
1)如果类的构造函数或析析构函数声明为私有的,那么该类不能被继承,但同时该类也不能使用;
2)派生类只能访问基类的公有成员和保护成员,如果是私有继承,基类中所有成员到子类中将成为私有的,子类的派生类也即子类的子类只能访问其直接父类的公有成员或保护成员,不能访问最原始基类的任何成员;
3)如果有三个类A、B、C,B虚拟继承A,C继承B,则意味着C将直接继承A和B,也即构造C的对象时,将会直接调用A的构造函数。
这里面包含的一些逻辑辩证关系比较复杂,综合运用起来可实现我们的final类,你悟到了吗?理理思路,且看这一段代码:
class FinalBase {
protected:
~FinalBase() {}
};
class Final : virtual private FinalBase {
public:
void foo() {
cout << "i'm a final class" << endl;
}
};
void tfinalclass() {
Final obj;
obj.foo();
}
这段代码中,Final类即为我们的final类,它不能被继承。实际上标准中好像有规定一个类如果有一个虚拟私有继承的基类,那么该类不能被继承,但编译器(我的版本为g++ 4.6.3)此处的似乎有bug,除了虚拟私有继承外,基类中构造或析构必须声明为protected。
以后要实现final类,只要虚拟私有继承FinalBase基类就可以了。
在C++11标准中,引入了final关键字,我们要实现final类就简单多了,这也是参考自java技术。我们可以简单实现如下
class FinalClass final {
public:
FinalClass() {
}
};
其中final为关键字,FinalClass不能被继承。