如果没有继承,类只是具有一些相关行为的数据结构,这只是对过程语言的一大改进,而继承则开辟了完全不同的新天地。通过继承,可以在已有类的基础上创建新类。这样,类就成为可重用和可扩展的组件。博主的《漫谈继承技术》系列博文将讲述各种利用继承功能的方法。学习继承的语法,和利用继承的一些复制技术。 本篇博文先给大家介绍一些final在继承中的使用,希望对大家加深对继承技术的理解有一定的帮助。
final
禁止继承
C++允许将类标记为final,这意味着继承这个类会导致编译错误。举个栗子吧!
#include <iostream>
using namespacestd;
//使用final修饰super类,该类禁止继承
class superfinal
{
public:
//编译器默认生成的析构函数是非虚函数,所以建议在任何时候都自己
//编写虚析构函数,即使它什么也不做(只是表面上什么也没做)
virtual~super(){}
};
//sub类继承super类,将导致编译错误
class sub: public super
{
public:
virtual~sub(){}
};
上面的代码将无法通过编译,编译报如下错误:
禁用重写
既然说到了final,那就顺便提一下它的另外一个应用场景,C++允许将虚函数标记为final,这意味着派生类重写该函数会导致编译错误。咱们还是举个栗子吧。
#include <iostream>
using namespacestd;
class super
{
public:
//编译器默认生成的析构函数是非虚函数,所以建议在任何时候都自己
//编写虚析构函数,至少在父类中应该这样做,即使虚函数它什么也不做(只是表面上什么也没做)
virtual~super(){}
virtualvoidshow() const final;
};
void super::show()const
{
cout<< __FUNCTION__ << endl;
}
//sub类继承super类
class sub: public super
{
public:
virtual~sub(){}
virtualvoidshow() const;
};
void sub::show()const
{
cout<< __FUNCTION__ << endl;
}
上面的代码将无法通过编译,编译报如下错误:
可能有的小伙伴对上面代码中的__FUNCTION__感到疑惑,没关系,第一次看到都会这样。如果我把它换做__func__,你是不是熟悉一点呢。在C99标准中,每个函数都有一个预定义的局部变量__func__(定义:staticconstchar__func__ = "funtion-name";)用来保存当前函数的名称。vs2012及以后的编译器将其改名为__FUNCTION__,换汤不换药,其原理和作用还是一样。
通过上面两个场景的学习,相信大家对final的使用已经掌握了吧。举的例子比较简单,为了方便大家的理解,复杂的栗子对大家初学final毫无益处。其实,final可以用sealed来代替,它们的作用完全一样,至少在我使用过的场景中它俩作用一样。
如果想了解更多关于继承技术相关的知识,请关注博主《漫谈继承技术》系列博文,相信你能够在那里寻找到更多有助你快速成长和深入你对继承相关的知识和一些复制的技术理解和掌握。