class Uncopyable{ private: Uncopyable(const Uncopyable&); Uncopyable& operator=(const Uncopyable&); } //作为基类继承即可
class AbstractClass { public: virtual ~AbstractClass(); } AbstractClass::~AbstractClass() { //函数实现 //目的是进行资源释放 }
class DBConn { private: DBConnect dbc; bool closed; public: void close() { dbc.close(); closed = true; } ~DBConn() { if(!closed) { try { dbc.close(); } catch(...) { //停止或记录 } } } } //解决close会跑出异常的可能
-
看清楚描述,是构造函数和析构函数中不能调用虚函数;析构函数本身是可以设计成虚函数的,且在某些情况下,必须设计成虚函数
-
在构造函数未执行完成之前,类的虚函数表未建立
-
进入析构函数之前,类的虚函数表已经销毁,无法调用
好处:便于连续赋值,类似下面这种执行方式:
a = b = c = d //连续赋值
class Widget { public: Widget& operator+=(const Widget& rhs) { return *this; } }
Widget& operator=(const Widget& rhs) { if(this == &rhs) return *this; // ... return *this; } Widget& operator=(const Widget& rhs) { Widget temp(rhs); swap(temp); return *this; } Widget& operator=(Widget rhs) //拷贝发生在参数传入的过程中 { swap(rhs); return *this; }