一般地,父类指针new一个子类对象,通过调用虚函数可以实现多态,以调用不同的子类方法。
但是在构造函数中调用虚函数则会不同。下面是例子:
class A
{
public:
A()
{
cout << "A::A()" << endl;
Foo();
}
virtual void Foo()
{
cout << "A::Foo()" << endl;
}
void Foo2()
{
cout << "A::Foo2()" << endl;
Foo();
}
};
class B : public A
{
public:
B()
{
cout << "B::B()" << endl;
Foo();
}
virtual void Foo()
{
cout << "B::Foo()" << endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
cout << "test1:" << endl;
A* pA = new B;
cout << endl << "test2:" << endl;
pA->Foo2();
return 0;
}
调用结果如下:
test1:
A::A()
A::Foo()
B::B()
B::Foo()
test2:
A::Foo2()
B::Foo()
请按任意键继续. . .
可以看出,在父类构造时并不会调用子类的Foo()方法。而在调用A::Foo2()函数调用时则能够正常调用到派生类的Foo()方法。
其实,此时,构造A时,子类并没有完成构造动作,如果此时调用,可能会发生不可预料的错误,因此会做此限制。
所以,如果想要实现多态,还是等到初始化完成后,例如构建一个Create()方法来实现软创建,在其中实现不同的方法。