在构造和析构过程中调用虚函数通常不会带来你所预想的结果,这是Java和C++不相同的一个地方
class Base
{
public:
Base()
{
Display();
}
void Display()
{
cout << "Base Show" << endl;
}
virtual ~Base(){}
};
class Derive:public Base
{
public:
Derive()
{
//Display();
}
void Display()
{
cout << "Derive Show"<<endl;
}
~Derive(){}
};
int main()
{
//Base b;
Derive d;
}
Derive d;无疑会有一个Derive构造函数被调用,但Base构造函数一定会被更早的调用,派生类的基类成分一定会在派生类自身成分被构造之前先构造出来。基类构造期间virtual函数绝不会下降到派生类阶层。
这会出现一个问题,派生类对象不能调用正确的Display()函数。要避免这类问题,可以将将Display函数改为non-virtual,要求在派生类构造函数传递必要信息给基类构造函数,然后基类构造函数调用non-virtual函数。
确保析构函数和构造函数不会调用virtual函数。
explicit 避免发生隐式转换。
在重写=运算符时要记得返回的是return *this,这样可以满足a=b=c这样的赋值操作。