限制类被继承或者函数被重写

本文介绍了在C++中如何防止类被继承及虚函数被重写的方法,包括使用特定宏定义和关键字来确保代码稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在系统开发过程中,我们需要通过对程序进行特殊的限制来表达那些是接口,那些是内部的实现。而C++不像Java或C#。拥有public class或者interface的keyword。

在这里介绍在C++中如何限制类或函数被派生。首先我们看几个例子。

class InterClass{
};
class B :public InterClass
{
};


 

在这里InterClass只是一个内部的实现,模块的开发人员可能在下一个版本中由于需要将这个类重构,或完全删除这个类。这个时候派生于这个类的类B,在拿到新的版本后,就会有很大的代码变化,同时需要进行大量的测试。

class A{
public:
    virtual void Interfunc();
}
class B: public A{
public:
    virtual void Interfunc();
}

class A{
public:
    void Interfunc(); //remove virtual
}
class B: public A{
public:
    virtual void Interfunc();
}


 

上面这个例子是A定义了虚函数virtual void Interfunc();。但这个虚函数在重构之后取消了虚函数的特性。那么派生类B可能还认为是虚函数。导致bug产生。

首先,那么我们看怎么在C++禁止一个类被派生。首先在VC11中使用了final的keyword。用来修饰class。使用这个keyword可以保证该类不被派生。

但是目前我们还没有这个keyword。我做了一个简单的代码可以帮助实现这个功能

 

class FinalSupportClass
{
protected:
     FinalSupportClass()
     {

     }
};
#define FINALCLASS : virtual private FinalSupportClass

不想被派生的类可以使用这个宏

class FinalClass FINALCLASS // the class which is final class use this marco
{

};
class A:  public FinalClass
{

};
int _tmain(int argc, _TCHAR* argv[])
{
     A a; // an error reported when compile
     return 0;
}


对于虚函数的限制在VC10中可以使用sealed这个keyword

class A
        {
        public:
            virtual void func() sealed{} ;
        };
        class B:public A
        {
        public:
            virtual void func(){} ; // an error reported when compile
        };


另外派生类在派生虚函数的时候可以使用override。这样当基类取消了虚函数后,就会在编译阶段出现错误。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值