构造函数一定不可以为虚函数。
A->B //A为基类,派生了B
A的析构函数为~A();
B的析构函数为~B();
现在定义了一个B对象。
若A的析构函数不为virtual,则B析构时,调用的是基类A的析构函数~A(),尽管B显式定义了自己的析构函数~B()。
若A的析构函数为virtual,则B析构时,先调用B的析构函数~B(),再调用基类A的析构函数~A()。
其他非构造与析构的函数,都可以声明为virtual。但若在类的构造与析构函数中调用这些虚函数,是不会呈现出多态的。
比如:
class A
{
A();
virtual ~A(){clear();}
virtual void clear();
}
class B : public A
{
B();
virtual ~B(){clear();}
virtual void clear();
}
main()
{
Bb;
A*pA = (A*)(&b);
deleatepA;
}
上面的代码,将B的对象b赋给基类A的指针pA,然后删掉pA。由于析构函数前有virtual关键字,这样会先调用B的析构函数再调用A的析构函数。
但是,由于是用A的指针来进行析构,当调用virtual~B(){clear ();}时,析构函数中又调用了一个虚函数clear(),那么到底是调用A的clear()还是B的clear()呢?
在构造函数与析构函数中,调用的一切其他virtual函数都失去多态性。
所以,调用virtual ~B(){clear ();}时,会直接调用B的clear()。然后调用virtual ~A(){clear ();}时,并且在其中会直接调用A的clear()。