要防止一个类被继承可以将他的构造函数和析构函数都设置为private权限
class A
{
private:
A()
{}
~A()
{}
int _a;
};
class B:public A
{
public:
B()
{}
~B()
{}
int _b;
};
这样做造成A类也无法构造对象
还可以将要防止被继承的类设置为另一个类的private友元再让这个类被要防止被继承的类继承
class A;
class C
{
private:
friend A;
C()
{}
~C()
{}
};
class A:public virtual C
{
public:
A()
{}
~A()
{}
};
class B:public A
{
public:
B()
{}
~B()
{}
};
int main()
{
A a;//可以构造
B b;//不可以构造
return 0;
}
在这个例子中A是C的友元类所以A可以访问C的private的构造函数所以A可以构造成功B不是C的友元B继承A同时A又继承自C但是B不是C的友元所以B无法访问C的构造函数,这样A就不能被继承了
对上面的代码进行优化设计一个不能被继承的模板类
template<class T>
class C
{
private:
friend T;
C()
{}
~C()
{}
};
class A:public virtual C<A>
{
public:
A()
{}
~A()
{}
};
class B:public A
{
public:
B()
{}
~B()
{}
};
int main()
{
A a;//可以构造
B b;//不可以构造
return 0;
}