不能被继承的类

虚继承模板类NoCopyable的类不可再被继承。

#include <iostream>
#include <cstdio>

template <typename T>
class NoCopyable {
public:
    friend T;

private:
    NoCopyable() {}
    virtual ~NoCopyable() throw() {}

    NoCopyable(const NoCopyable &);
    const NoCopyable & operator=(const NoCopyable &);
};

class Base : virtual public NoCopyable<Base> {
public:
    Base()  {
        std::cout << __TIME__ << "," << __FUNCTION__ << "\n";
    }

    ~Base() throw ()    {
        std::cout << __TIME__ << "," << __FUNCTION__ << "\n";
    }

private:
    Base(const Base &);
    const Base & operator=(const Base &);
};

class Derived : public Base {
public:
    Derived()    {
        std::cout << __TIME__ << "," << __FUNCTION__ << "\n";
    }

    ~Derived() throw()    {
        std::cout << __TIME__ << "," << __FUNCTION__ << "\n";
    }
};

int main() {
    Derived d;
    return 0;
}

类NoCopyable的构造函数和析构函数因为是私有的,只有NoCopyable类的友元可以访问,Base类在继承时将模板的参数设置为了Base类,所以构造Base类对象时们可以直接访问父类(Base)的构造函数。

而创建Derived对象时,Derived类的构造函数就要负责虚基类(NoCopyable)的构造,但是NoCopyable的构造函数是私有的,Derived没有访问的权限(友元关系不能被继承的),所以Derived类在编译时就会报错。这样Base类就不能被继承了.