关闭

多继承的构造顺序

152人阅读 评论(0) 收藏 举报
构造对象的规则需要扩展以控制多重继承。构造函数按下列顺序被调用:
  (1)任何    虚拟基类的构造函数按照它们被继承的顺序构造;(#add 即声明顺序)
  (2)任何非虚拟基类的构造函数按照它们被继承的顺序构造;
  (3)任何成员对象的构造函数按照它们声明的顺序调用;
  (4)类自己的构造函数。
  例如:

    //**********************
    //**   ch17_4.cpp  **
    //**********************

    #include<iostream.h>

    class OBJ1
    {
     public:
      OBJ1(){ cout <<"OBJ1\n"; }
    };

    class OBJ2
    {
     public:
      OBJ2(){ cout <<"OBJ2\n"; }
    };

    class Base1
    {
     public:
      Base1(){ cout <<"Base1\n"; }
    };

    class Base2
    {
     public:
      Base2(){ cout <<"Base2\n"; }
    };

    class Base3
    {
     public:
      Base3(){ cout <<"Base3\n"; }
    };

    class Base4
    {
     public:
      Base4(){ cout <<"Base4\n"; }
    };

    class Derived :public Base1, virtual public Base2,
        public Base3, virtual public Base4
    {
     public:
      Derived() :Base4(), Base3(), Base2(), 
         Base1(), obj2(), obj1()
     {
      cout <<"Derived ok.\n";
     }
     protected:
      OBJ1 obj1;
      OBJ2 obj2;
    };

    void main()
    {
     Derived aa;
    }

  运行结果为:
    Base2
    Base4
    Base1
    Base3
    OBJ1
    OBJ2
    Derived ok.

  Derived的虚基类Base2和Base4最先构造,尽管它在Derived类中出现的顺序不在最前面;Derived的非虚基类其次构造,不管它在Derived构造函数中出现的顺序如何;Derived的组合对象obj1和。obj2随后构造, 它以类定义时,数据成员排列顺序为准, 不管在Derived构造函数中出现顺序怎样;最后是Derived类构造函数本身。

  ->在语言中实现多继承并不容易,这主要是编译程序问题,还有模糊性问题。建议你如果可能,在进一步阅读有关参考书之前,尽量避免用多重继承。单个继承提供了足够强大的功能,不一定非用多重继承不可。我们应先学会阅读一些商品化的类库源程序中有关多重继承的部分,因为那些都是经过测试的安全代码。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:24991次
    • 积分:311
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:43篇
    • 译文:0篇
    • 评论:1条
    最新评论