多继承的构造顺序

转载 2012年03月28日 11:34:51
构造对象的规则需要扩展以控制多重继承。构造函数按下列顺序被调用:
  (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类构造函数本身。

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

多继承的构造顺序

构造对象的规则需要扩展以控制多重继承。构造函数按下列顺序被调用:   (1)任何    虚拟基类的构造函数按照它们被继承的顺序构造;(#add 即声明顺序)   (2)任何非虚拟基类的构造函数按照...
  • liulihuo_gyh
  • liulihuo_gyh
  • 2015年11月13日 11:04
  • 638

C++多继承构造函数调用顺序

class B1 {public: B1(int i) {cout
  • IEEEITU
  • IEEEITU
  • 2011年09月17日 21:48
  • 4301

C++中多重继承构造函数调用的先后顺序

#include using namespace std; class E { public: E() { cout
  • u012954083
  • u012954083
  • 2014年04月09日 11:12
  • 1607

Scala学习第十五天 Scala多重继承、多重继承构造器执行顺序及AOP实现

内容: 1 多重继承的trait代码实战 2 多重继承构造器执行顺序 3 基于trait的AOP代码实战//这讲内容对做大型项目十分重要,trait本身可以有方法的实现,这样做大型工程的具体模块...
  • abc7845129630
  • abc7845129630
  • 2015年11月26日 13:58
  • 735

python3 中多继承的顺序问题

在python中,会遇到多层继承嵌套的问题,那么如果不同父类中存在相同名的方法,那么对于子类而言如果去继承父类的方法就是我们需要考虑的了。...
  • u012193416
  • u012193416
  • 2017年10月04日 11:22
  • 186

C++多继承中菱形继承构造函数与析构函数执行的顺序

// test1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "iostream" using namespace std; cla...
  • d06110902002
  • d06110902002
  • 2016年05月24日 18:18
  • 365

python3 多继承和MRO顺序

# coding=utf-8 print("******多继承使用类名.__init__ 发生的状态******") class Parent(object): def __init__(s...
  • u010460422
  • u010460422
  • 2017年12月01日 17:08
  • 65

java内部类回顾之一般内部类实现多继承和封装性

本文的标题可能有一定的误导性,并不是说一般内部类就能实现多继承,显然这是不可能的。真正的意思是通过多继承来实现我们期望中的多继承的功能。 这里就拿人类来举例吧,人(Person)是一种生物(biolo...
  • puhaitao1987
  • puhaitao1987
  • 2014年12月29日 14:24
  • 775

多继承构造顺序

按你的描述: class C :public virtual B1,public virtual B2,public B3 { public A; ...
  • tianzhijiaozi19
  • tianzhijiaozi19
  • 2016年09月24日 08:19
  • 253

C++ 多继承构造函数初始化列表调用顺序

class B1    {public:    B1(int i)     {cout"consB1"  };//定义基类B1   class B2     {public:    B2...
  • Bruce_0712
  • Bruce_0712
  • 2016年12月20日 10:43
  • 1013
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多继承的构造顺序
举报原因:
原因补充:

(最多只允许输入30个字)