将构造函数以及非成员函数 “虚化”

虚构造函数,这似乎是非常违反直观 的一件事情,由于当你拥有一个对象的指针或者引用的时候,你能够通过该对象的动态类型来调用虚函数,而在此处,你的对象还没有构造完毕。

事实上,“虚构造函数”并非把你的构造函数声明为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虚化了。


posted @ 2015-03-02 19:29  mfrbuaa  阅读(193)  评论(0编辑  收藏  举报