构造函数和析构函数中的虚函数调用
一个类的虚函数在它自己的构造函数和析构函数中被调用的时候,它们就变成普通函数了,不“虚”了。也就是说不能在构造函数和析构函数中让自己“多态”。例如:
class A
...{
public:
A() ...{ foo();} // 在这里,无论如何都是A::foo()被调用!
~A() ...{ foo();} // 同上
virtual void foo();
};
class B: public A
...{
public:
virtual void foo();
};
void bar()
...{
A * a = new B;
delete a;
}
如果你希望delete a的时候,会导致B::foo()被调用,那么你就错了。同样,在new B的时候,A的构造函数被调用,但是在A的构造函数中,被调用的是A::foo()而不是B::foo()。
一个类的虚函数在它自己的构造函数和析构函数中被调用的时候,它们就变成普通函数了,不“虚”了。也就是说不能在构造函数和析构函数中让自己“多态”。例如:
class A
...{
public:
A() ...{ foo();} // 在这里,无论如何都是A::foo()被调用!
~A() ...{ foo();} // 同上
virtual void foo();
};
class B: public A
...{
public:
virtual void foo();
};
void bar()
...{
A * a = new B;
delete a;
}
如果你希望delete a的时候,会导致B::foo()被调用,那么你就错了。同样,在new B的时候,A的构造函数被调用,但是在A的构造函数中,被调用的是A::foo()而不是B::foo()。