答案是可以的,只是起不到虚函数的作用,下面的例子输出为:
Base::Fuction
A::Fuction
原因:
C++编程思想的14.8.2 中讲到这个问题;对于普通的成员函数,虚函数的调用时在运行时决定的,这是因为编译时并不知道这个对象是属于这个成员
函数所在的那个类,还是属于由它派生的类。但是对于在构造函数中调用一个虚函数,被调用的只是这个函数的本地版本,也就是说,
虚函数在构造函数中不起作用;
这个行为有两个理由。在概念上,构造函数的工作是把对象变成存在物。在任何构造函数中,对象可能只是部分被形成—我们只能知道基类已被初始化了,但不知道哪个类是从这个基类继承来的。然而,虚函数是“向前”和“向外” 进行调用。它能调用在派生类中的函数。如果我们在构造函数中也这样做,那么我们所调用的函数可能操作还没有被初始化的成员,这将导致灾难的发生。
第二个理由是机械的。当一个构造函数被调用时,它做的首要的事情之一是初始化它的V P T R。因此,它只能知道它是“当前”类的,而完全忽视这个对象后面是否还有继承者。当编译器为这个构造函数产生代码时,它是为这个类的构造函数产生代码 - -既不是为基类,也不是为它的派生类(因为类不知道谁继承它) 。所以它使用的V P T R必须是对于这个类的V TA B L E。而且,只要它是最后的构造函数调用,那么在这个对象的生命期内, V P T R将保持被初始化为
指向这个V TA B L E。但如果接着还有一个更晚派生的构造函数被调用,这个构造函数又将设置V P T R指向它的V TA B L E,等等,直到最后的构造函数结束。V P T R的状态是由被最后调用的构造函数确定的。这就是为什么构造函数调用是从基类到更加派生类顺序的另一个理由。
程序如下:
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
Fuction();
}
virtual void Fuction()
{
cout << "Base::Fuction" << endl;
}
};
class A : public Base
{
public:
A()
{
Fuction();
}
virtual void Fuction()
{
cout << "A::Fuction" << endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
A a;
return 0;
}