码迷,mamicode.com
首页 > 其他好文 > 详细

利用友元+虚继承实现不可被继承的类

时间:2015-07-06 23:05:03      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:

 

这个问题的传统解法是把构造和析构函数设为private,但是有很多不方便的地方,如无法直接定义它的对象。

 

一个非常开脑洞的做法是使用友元+虚继承来实现。

template<typename  T>
class A
{
    friend T;
private:
    A() {};
    ~ A() {};
};
class B: virtual public A<B>
{
};
class C :public B
{

};
int main()
{
    C c;
    return 0;
}

定义类模版A为不可继承的类模版,并将构造和析构函数设为private,但是友元模版被具现化为不可被继承的那个类,目的是让该类可以访问构造和析构函数但是其他类不可以。

然而在实际中B的派生类C也可以通过B访问到A的构造和析构函数,于是将B改为虚继承,这样在构造C的对象的时候会跳过B先构造A的部分,但是C是无权直接访问A的,因此构造失败,从而禁止了C继承B。

 

注意,在C++11中加入了final这个关键字已经完美地解决了这个问题。

 

利用友元+虚继承实现不可被继承的类

标签:

原文地址:http://www.cnblogs.com/rockzh/p/4625431.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!