如何定义一个不能被继承的类???
假设有一个类B,如果把B的构造函数声明为私有的,那么B这个类就不能被继承,但是这也引入了一个问题,不能在类外定义B类型的对象,那要怎么解决这个问题呢???
方法1:
我们可以在类内创建一个对象并提供一个静态的接口,返回创建的这个对象。但是如果使用这种方法的话,在定义B的对象的时候感觉不是很完美。
这种写法有点类似于单例:
#include <iostream>
class CParent
{
private:
CParent(int v){m_v = v;}
~CParent(){}
int m_v;
static CParent * m_instance;
public:
void fun(){std::cout << "The value is: " << m_v << std::endl;}
static CParent * getInstance(int v);
};
CParent *CParent::getInstance(int v)
{
return new CParent(v);
}
int main() {
CParent *parent = CParent::getInstance(10);
parent->fun();
}
方法2:
我们可以声明一个辅助的类A,把类A的构造函数声明为私有的,并使得B是A的友元类,且B虚继承A。让B是A的友元类的目的在于能够让B访问A的私有构造函数,这样继承自A的B才可以被实例化。
假设现在有一个类D继承B,在D初始化的时候会先调用B类的构造函数,但是由于B虚继承A,所以为了防止产生二义性,D必须先调用A的构造函数,由于A的构造函数是私有的不可访问,所以会产生错误,继承会失败。
class B;
//设计一个不能被继承的类
class A
{
friend B;
private:
A() {}
};
class B :virtual public A
{
public:
B() {}
};
方法3:
c++11标准提供关键字final。将类声明为final即可。