条款09:绝不在构造和析构过程中调用virtual函数
首先看下面一段代码,我们将在基类的构造函数中调用虚函数
#include<iostream> #include<cstring> #include<cstdio> using namespace std; class base{ public: base(){ fun(); } virtual void fun(){ cout<<"base class - fun\n"; } }; class dev: public base{ public: dev(){ fun(); } virtual void fun(){ cout<<"dev class - fun\n"; } }; int main(){ dev d; return 0; }
编译之后这段程序的输出是:
base class - fun dev class - fun
也就是说,其在我们不知情的情况下,私自调用了基类的fun函数!所以为了保证程序的可靠性,在构造和析构期间不要调用virtual函数,因为这类调用从不下降至派生类
条款10:令operator=返回一个reference to *this
之所以有这样的条款,是为了方便我们进行如下的操作
data a,b,c; a = b = c;
如果没有返回值,很明显上面的代码会报错。具体的写法如下
class base{ public: int data; base& operator=(const base& a){ this->data = a.data; return *this; } };