zoukankan      html  css  js  c++  java
  • 将构造函数以及非成员函数 “虚化”

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

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


  • 相关阅读:
    【洛谷P1082】同余方程
    【总结】数论相关
    【模板】扩展欧拉定理
    【模板】贝祖定理
    【SPOJ116】Intervals
    【CF1141E】Superhero Battle
    【CF1141F2】Same Sum Blocks
    【CF1141F1】Same Sum Blocks
    【CF1141G】Privatization of Roads in Treeland
    【洛谷P1198】最大数
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4309593.html
Copyright © 2011-2022 走看看