方法一:
使用一个构造和析构函数都是私有的一个基类IAssistant,且将被设计不能继承的FinalClass类设置成该基类IAssistant的友元类;
之后FinalClass以虚继承的方式继承该基类IAssistant;
虚继承的功能是:当出现了菱形继承体系的时候,子孙类不会继承多个原始祖先类;
使用虚继承会导致基类的初始化任务必须由继承体系中最底层的类完成,
即FinalClass类的子类声明对象时,必须直接调用IAssistant类中的构造函数,而不是先调用FinalClass类的构造函数,然后再通过FinalClass类来调用IAssistant类的构造函数.
template<typename T>
class IAssistant
{
private:
friend T;
IAssistant(){}
~IAssistant() {}
};
class FinalClass : virtual IAssistant <FinalClass>
{
public:
FinalClass() {}
~FinalClass() {}
};
//test
class CImage : public FinalClass
{
public:
CImage()
{
std::cout << "class CImage" << std::endl;
}
};
int main(int argc, char** argv)
{
CImage img; //Error 1 error C2248: 'IAssistant<FinalClass>::IAssistant' : cannot access private member declared in class 'IAssistant<FinalClass>'
return 0;
}
在构造CImage 类时,构造函数不能成功构造!!!报错 error C2248: 'IAssistant<FinalClass>::IAssistant' : cannot access private member declared in class 'IAssistant<FinalClass>
//方法二
//直接将类设置 final属性,表明该类似最终类不能被继承,该方法需要c++11之后的支持
class FinalClassEx final
{
public:
FinalClassEx(){}
~FinalClassEx(){}
};
//test
class CImageEx : public FinalClassEx
{
public:
CImageEx()
{
std::cout << " class CImageEx " << std::endl;
}
};
int main(int argc, char** argv)
{
CImageEx Imgex;//Error 2 error C3246: 'CImageEx' : cannot inherit from 'FinalClassEx' as it has been declared as 'final'
return 0;
}
在构造CImageEx 类时,构造函数不能成功构造!!! 报错//Error 2 error C3246: 'CImageEx' : cannot inherit from 'FinalClassEx' as it has been declared as 'final'