实现一个无法被继承的C++类
来源:互联网 发布:清华大学软件学院地址 编辑:程序博客网 时间:2024/05/19 00:53
一个类不能被继承,也就是说它的子类不能构造父类,这样子类就没有办法实例化整个子类从而实现子类无法继承父类。我们可以将一个类的构造函数声明为私有,使得这个类的构造函数对子类不可见,那么这个类也就不能继承了。但是,这引出一个问题,客户程序岂不是也无法实例化这个类了?OK,让我们参考一下Singleton模式,用一个static函数来帮助创建这个类的实例,问题就解决了!
class CParent
{
private:
CParent(int v){m_v = v;}
~CParent(){}
int m_v;
static CParent * m_instance;
public:
void fun(){cout << "The value is: " << m_v << endl;}
static CParent * getInstance(int v);
};
CParent * CParent::m_instance = NULL;
CParent * CParent::getInstance(int v)
{
m_instance = new CParent(v);
return m_instance;
}
这是一个有效的方法,但是static函数创建出来的实例必然是static的。而且,这个类不能像普通的类那样构建对象,比如:
CParent c; // impossible
换个思路考虑一下,友元不也是不能被继承的么?我们可以把类的构造函数定义为private的同时,定义友元函数来帮助构造类的实例。
{
private:
CParent(int v){m_v = v;}
~CParent();
int m_v;
public:
void fun(){cout << "The value is: " << m_v << endl;}
friend CParent * getInstance(int v);
};
CParent * getInstance(int v)
{
CParent * pinstance = new CParent(v);
return pinstance;
}
这个类也是不能被继承的,但是出现的问题和前面一样:我们还是不能像对普通类那样对待这个类。
现在设想一下,有一个CParent类,我们不希望他能够被继承。在友元不能被继承的思路指引下,我们要考虑让CParent的友元属性不能被继承。假设有一个辅助类CNoHeritance,CParent是CNoHeritance类的友元。还要假设一个CChild类,它试图去继承CParent类(如果它有这个能耐的话)。
先把CNoHeritance类的构造函数定义成private,然后将CParent声明为CNoHeritance的友元类。同时CParent继承了CNoHeritance类。到目前为止,CNoHeritance除了CParent类以外,谁也无法对它进行访问和实例化。CChild因为无法继承CParent的友元特性,所以CChild无法对CNoHeritance直接进行实例化(但是可以通过CParent)。
到目前为止,CParent还是可以被继承的。这是一个trick.让我们整理一下思路,下面的图说明了CNoHeritance, CParent和CChild三个类之间的关系。
如果我们让CParent类虚继承CNoHeritance类,根据虚继承的特性,虚基类的构造函数由最终的子类负责构造。因此CChild如果要想继承CParent,它必须能够构造CNoHeritance,这是不可能的!因此,我们的CParent也就终于成为了一个无法继承的类。
class CNoHeritance
{
private:
CNoHeritance(){}
~CNoHeritance(){}
friend class CParent;
};
class CParent : virtual public CNoHeritance
{
public:
CParent(int v){m_v = v;}
~CParent(){};
private:
int m_v;
public:
void fun(){cout << "The value is: " << m_v << endl;}
};
class CChild : public CParent
{
public:
CChild():CParent(10){}
~CChild(){}
};
需要注意的是,我们这里引入的CNoHeritance类对整个程序而言,只引入了Private的构造函数和析构函数,所以不会因为可能的菱形继承带来二义性.
- 实现一个无法被继承的类
- 实现一个无法被继承的C++类
- 实现一个无法被继承的C++类
- 实现一个无法被继承的C++类
- 实现一个无法被继承的C++类
- 实现一个无法被继承的C++类(转)
- 实现一个无法被继承的C++类
- 实现一个无法被继承的C++类
- 实现一个无法被继承的C++类
- 【c++】实现一个不能被继承的类
- 如何写一个无法被继承的类
- c++设计一个无法被继承的类
- 试题:实现一个不能被继承的类(上)
- 试题:实现一个不能被继承的类(下)
- 试题:实现一个不能被继承的类(续之下)
- 试题:实现一个不能被继承的类(续之上)
- 用C++实现一个不能被继承的类
- 用C++实现一个不能被继承的类
- HDU_ACM-2014 青年歌手大奖赛-评委打分
- Java学习要点记录
- C++模板学习
- Seafile介绍
- 黑马程序员——Java基础——IO流(文本文件读取方式)
- 实现一个无法被继承的C++类
- js实现图片预加载 imgpreLoad.js
- Eclipse luan(Eclipse4.4)tomcat(无法显示)插件安装不了的解决方法
- (总结)C++中实现代码重用的手段----继承和聚合
- 黑马程序员——Java基础——IO流(拷贝文件)
- POJ 3080:Blue Jeans:枚举求解n个字符串的最长公共连续子串
- 纪念逝去的昨天(3)
- vitualbox archtect
- 如何将循环转为递归函数