1 构造函数能否是虚函数?
多态:根据对象的动态类型来选择要调用的方法。而在构造函数之前,对象甚至都不存在。
构造函数不能是虚函数,在创建一个对象的时候,构造函数需要的是它要创建的对象的准确的类型,所以不能是虚函数。除此之外,构造函数并不是一般的函数,它跟内存管理的交互方式不同于一般的成员函数,所以不能用指针指向构造函数。
vtable是在构造函数中才初始化的,找不到vtable就不可能调用。
析构函数可以是虚函数,而且常常如此,由于通常通过基类的指针来销毁对象,如果析构函数不为虚的话,就不能正确识别对象类型,从而不能正确销毁对象。
解释:在类的继承中,如果有基类指针指向派生类,那么用基类指针delete时,如果不定义成虚函数,派生类中派生的那部分无法析构。
class A
{
public:
A();
virtual ~A();
};
A::A()
{
}
A::~A()
{
printf("Delete class AP/n");
}
class B : public A
{
public:
B();
~B();
};
B::B()
{ }
B::~B()
{
printf("Delete class BP/n");
}
int main(int argc, &nbs