虚构造函数,这似乎是很违反直观 的一件事情,因为当你拥有一个对象的指针或者引用的时候,你可以通过该对象的动态类型来调用虚函数,而在此处,你的对象还没有构造完成。
其实,“虚构造函数”并不是把你的构造函数声明为virtual,而是某一种函数,根据其输入数据,来决定此时构造什么类型的对象。比如你要从文件或者网络上读取一些数据,从该数据你来决定你要创建什么类型的对象。
比如:
下述的继承体系:[摘自More Effective C++ P124]
class Base
{
public: ... ; //类的定义细节不重要,省略
};
class Child1 : public Base
{
public: ... //同上
};
class Child2:public Base
{
pubic: ... //同上
};
class Children
{
private:
list<Base *> childs;
};
上述Children对象的构造可能是根据读入的数据(比如标准输入端)来决定的,因此会有下面的构造函数:
Children ::Children(istream &in)
{
while(in非空)
//读取数据进行初始化,并且加入到Childs链表中。
}
于是乎,上面的读入数据初始化的过程我们可以使用一个函数读取输入流,构造对象并返回,于是Children类就会像这样:
class Children
{
public:
...
private:
static Base *read_input(istream & in);
};
Childrent::Children(istream &in)
{
while(in 非空)
{
childs.push_back(read_input(in));
}
}
就这样,就将ctor虚化了。
将构造函数以及非成员函数 “虚化”,布布扣,bubuko.com
原文地址:http://blog.csdn.net/xuqingict/article/details/36698463