Item 33. Manufacturing Abstract Bases
抽象基类描述了一个问题的抽象概念,它不能被实例化。
class ABC {
public:
virtual ~ABC();
virtual void anOperation() = 0; // pure
//...
};
一个类中有了一个纯虚函数就成为了抽象类,编译器可以保证ABC不能实例化。
有时候一个类没有候选的纯虚函数,但又想让它不能被实例化,如何办?
1、构造函数和拷贝构造函数声明为保护成员
class ABC {
public:
virtual ~ABC();
protected:
ABC();
ABC( const ABC & );
//...
};
class D : public ABC {
//...
};
2、将析构函数声明为纯虚函数,并提供其实现
class ABC {
public:
virtual ~ABC() = 0;
//...
};
//...
ABC::~ABC() { ... }
3、当一个类根本就没有虚函数,也没需要显式声明构造函数时,就把非虚析构函数声明为保护的
class ABC {
protected:
~ABC();
public:
//...
};