如何设计一个C++类,要求该类不能被继承

方法一:
使用一个构造和析构函数都是私有的一个基类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'

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值