虚继承模板类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类就不能被继承了.