构造函数是继承实现的关键,每次子类对象构造时,首先调用的是父类的构造函数,然后才是自己的,也就是子类的构造函数。
使用友元、虚继承、模板来实现,如下:
1、将A的构造函数和析构函数都声明为Private,将B设置为A的友元类,那么B就可以访问A的私有的构造函数和析构函数,B可以正常构造;
2、目的使B的子类C不能被正常构造,可以让C直接调用A的私有的构造函数和析构函数,那么就是将B设置为A的虚拟继承类;
3、友元关系:单向性,不可继承,不可传递。所以C无法像B一样可以访问A的私有的,所以C调用A的构造函数时会报错。
类模板:针对仅数据成员和成员函数类型不同的类,可以写成模板:
#include <iostream>
using namespace std;
template<class T>
class A
{
friend T;//注意这里不需要class关键字
//将构造函数和构构函数都声明是私有的
private :
A()
{
}
~A()
{
}
};
//这里一定需要使用虚继承,只有使用虚继承,它的子类才会直接调用A类的构造函数
//这样才会报错,如果是普通继承,那么通过B类调用A类的构造函数时时不会报错的
class B:public virtual A<B>
{
};
class C:public B
{
};
int main()
{
B b;
cout<<"success"<<endl;
// C c;
return 0;
}