无意中看到一个题目:题目大致意思是如何编写一个不能被继承但是却能正常使用的类?
当时首先想到的就是构造函数是私有的,这样的话就能不被继承,现实中我们使用的比较多的就是单例模式,将构造函数私有化,
但是单例模式不能正常的创建多个实例对象,是一种特殊的设计模式。再仔细考虑下c++中friend关键字,他可以声明友元类和友元函数,如果我们把子类声明为父类的友元类,子类再继承父类,那么子类不久可以完美的访问到父类的构造函数了吗。于是乎:
#include "iostream"
class base
{
private:
base() {
std::cout << "call the base construct func" << std::endl;
}
base(int data) {
std::cout << "call the base construct func" << std::endl;
this->data = data;
}
friend class driver;
private:
int data;
};
class driver :virtual public base
{
public:
driver() {
std::cout << "call the driver construct func" << std::endl;
}
driver(int data):base(data)
{
std::cout << "call the driver construct func" << std::endl;
}
};
int main(int argc,char *argv[])
{
driver d_one;
driver d_two(3);
std::cout << sizeof(C);
getchar();
return 0;
}
运行完美。
我们再写一个类尝试去继承driver
class C : public driver
{
public:
};
然后再主函数中尝试创建一个C的对象 C c,发现并没有任何输出,因为基类base的构造函数是private的,通过virtual继承,即base是driver的虚基类,必须通过调用他的派生类去主动调用,(多继承类防止二义性也是这个原理),但是该类C对base类并没有访问权限,因此是无法正常创建的。