虚函数拥有因类型而异的行为。而构造函数则是已经明确了对象,才调用的,所以,构造函数不能为虚函数,但是,我们可以通过一些方法使得构造函数可以有虚函数的功能。
所谓的虚构造函数,是一种函数,视其获得的输入,可产生不同类型的对象。用途:如在从磁盘(或网络或磁带等)读取信息时。
class A{ //抽象基类,内含虚函数
public:
..
};
class B:public A{
public:
..
};
class C:public A{
public:
..
};
class D{
public:
D(istream& str)
{
while(str){...}
}
private:
list<A*> data;
};
这个例子中,无论你传递给D,B还是C,都可以生成B或者C的对象(在B和C不是抽象类的情况下)。
虚拷贝构造函数:
虚拷贝构造函数比较容易实现,就是将基类中拷贝构造函数声明成纯虚函数。
这个方法是利用c++的规则的宽松点:
当派生类重新定义其基类的一个虚函数时,不再需要返回值相同。
非成员函数虚化方法:
写一个虚函数做实际工作,再写一个什么都不做的非虚函数,专门调用虚函数。
例子请见more effective c++