C++11中的final关键词

阅读stroustrup网站中对于C++11的FAQ,其中有final关键词。猿猿立刻就想到了一道非主流的面试题:


如何创建一个不能被继承的类?


先看“先进生产力的代表”C++11(猿猿有点落伍了,现在还在学习11标准,sigh~~),so easy!


class A{
public:
    virtual ~A() final;
};

那回到以前的标准上,又该如何做呢?


有一个想法很自然:将析构函数private化,这样就不能被继承了。可是理想很丰满,现实很骨感。这样的类A不能在栈中实例化,即使在堆中也不能delete掉。另外一个bug就是:如果继承类B实例是new出来的,并且不调用delete,编译器并不会报错。总而言之,析构函数private化会导致这个类不能被”有效“实例化


那么,以前的大拿们是怎么做到的呢?猿猿们的创造性是没有边界的。利用了”友元的不可继承性“,来达到不能被继承的效果。参考这里


上述博文中采用的方法,每一个不能被继承的类都需要来定义一个NoHeritance虚类。本文作者是个懒猿猿,不喜欢重复的东西,就弄了一个模板类

template <class Base>
class NoHeritanceInterface
{
	NoHeritanceInterface() = default;
	~NoHeritanceInterface() = default;
	friend class Base;
};

至于为啥原文博主要用虚继承的形式,懒猿猿也不是很明白。没有数据也没有虚表自然不会造成菱形继承的困扰。


这样看来,C++11的新特性确实能够省事不少。我们要好好利用之。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值