怎么在本机做网站,小程序平台如何招商入驻,哈尔滨建筑网,国内市场调研公司原文地址#xff1a;http://blog.csdn.net/lazy_tiger/article/details/2224899 一个类不能被继承#xff0c;也就是说它的子类不能构造父类#xff0c;这样子类就没有办法实例化整个子类从而实现子类无法继承父类。我们可以将一个类的构造函数声明为私有#xff0c;使得这…原文地址http://blog.csdn.net/lazy_tiger/article/details/2224899 一个类不能被继承也就是说它的子类不能构造父类这样子类就没有办法实例化整个子类从而实现子类无法继承父类。我们可以将一个类的构造函数声明为私有使得这个类的构造函数对子类不可见那么这个类也就不能继承了。但是这引出一个问题客户程序岂不是也无法实例化这个类了OK让我们参考一下Singleton模式用一个static函数来帮助创建这个类的实例问题就解决了 1 class CParent2 {3 private:4 CParent(int v){m_v v;}5 ~CParent(){}6 int m_v;7 static CParent * m_instance;8 public:9 void fun(){cout The value is: m_v endl;}
10 static CParent * getInstance(int v);
11 };
12 CParent * CParent::m_instance NULL;
13 CParent * CParent::getInstance(int v)
14 {
15 m_instance new CParent(v);
16 return m_instance;
17 } 这是一个有效的方法但是static函数创建出来的实例必然是static的。而且这个类不能像普通的类那样构建对象比如 1 CParent c; // impossible 换个思路考虑一下友元不也是不能被继承的么我们可以把类的构造函数定义为private的同时定义友元函数来帮助构造类的实例。 class CParent
{
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的友元属性不能被继承。假设有一个辅助类CNoHeritanceCParent是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也就终于成为了一个无法继承的类。 1 class CNoHeritance2 {3 private:4 CNoHeritance(){}5 ~CNoHeritance(){}6 friend class CParent;7 };8 class CParent : virtual public CNoHeritance9 {
10 public:
11 CParent(int v){m_v v;}
12 ~CParent(){};
13 private:
14 int m_v;
15 public:
16 void fun(){cout The value is: m_v endl;}
17 };
18 class CChild : public CParent
19 {
20 public:
21 CChild():CParent(10){}
22 ~CChild(){}
23 }; 需要注意的是我们这里引入的CNoHeritance类对整个程序而言只引入了Private的构造函数和析构函数所以不会因为可能的菱形继承带来二义性. 转载于:https://www.cnblogs.com/theCambrian/p/3501806.html