转自:http://blog.csdn.net/guiyinzhou/article/details/6411685
这里面介绍一种借用虚继承和友元机制实现的方法。其实说到底,防止一个类被继承,我们还是想怎么使的派生类在构造时不能够调用基类的构造函数,从而不能完成继承。我们都知道,派生类对象初始化时,首先要运行基类构造函数,将基类子对象进行初始化,之后再运行派生类的构造函数,初始化派生类中特质不同的成员。下面介绍一种方法:
- #include <iostream>
- using namespace std;
- class Base1;
- class Base{
- public:
- ~Base(){cout<<"Base::~Base()"<<endl;}
- friend class Base1;
- private:
- Base(){cout<<"Base::Base()"<<endl;}
- };
- class Base1: virtual public Base{ //虚继承
- public:
- Base1(){cout<<"Base1::Base1()"<<endl;}
- ~Base1(){cout<<"Base1::~Base1()"<<endl;}
- };
- class Drived: public Base1{
- public:
- Drived(){cout<<"Drived::Drived()"<<endl;}
- ~Drived(){cout<<"Drived::~Drived()"<<endl;}
- };
- int main(){
- Drived D;
- }
首先定义一个基类Base,但在Base类中,其构造函数被定义为私有的。接下来Base1虚继承Base类,Base类成了虚基类,而Base1是Base的友元,可以调用Base的构造函数初始化对象。但是到了派生类Drived时候,它是最低层的派生类,按照规则“最低层派生类的构造函数初始化虚基类”,Drived类跨过Base1直接调用Base类中的构造函数去初始化虚基类部分的子对象,然而由于Base类的构造函数是私有的,Drived类的构造函数无权调用,因此初始化失败。这就导致了一个有趣的现象,Drived类继承Base1类,结果由于无法调用虚基类Base的构造函数而无法完成对象的创建,给人的感觉就是Base1类无法被继承。