多继承的构造顺序

转载 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类构造函数本身。

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

相关文章推荐

C++在单继承、多继承、虚继承时,复制构造函数。赋值构造函数、析构函数的执行顺序

一、本文目的与说明     1. 本文目的:理清在各种继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容。     2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地...

C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容

一、本文目的与说明     1. 本文目的:理清在各种继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容。     2. 说明:虽然复制构造函数属于构造函数的一种,有...

C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容

转载自:http://blog.csdn.net/daheiantian/article/details/6438782 一、本文目的与说明     1. 本文目的:理清在各种...

C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容

一、本文目的与说明     1. 本文目的:理清在各种继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容。     2. 说明:虽然复制构造函数属于构造函数的一种,有...

C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容

这篇文章写的很好,就转载了, 原文地址:http://blog.csdn.net/daheiantian/article/details/6438782

python中单继承和多继承中子类默认继承父类的哪个构造函数__init__

单继承情况 (1)子类默认无__init__时,则会直接继承父类__init__ #!/usr/bin/env python #coding=utf-8 class BaseClass: ...

C++继承中析构函数 构造函数的调用顺序以及虚析构函数

" 首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造...

继承中构造函数和析构函数地调用顺序

现在,有三个类,类的定义如下 class CA { public:  CA(){cout       ~CA(){cout }; class CB:public CA { pu...

静态代码块,非静态代码库,构造函数,子父继承代码执行顺序

静态代码块与静态方法的区别? 什么情况下使用 静态代码块:在项目启动的时候就需要执行的代码,这些代码是主动执行的; 静态方法:在项目启动的时候就初始化,在不创建对象的情况下,能够直接使用的,这种代码...

在继承条件下构造函数、代码块、静态代码块执行顺序

最近重新阅读了java中关于继承的章节,突发奇想父类子类代码中的构造函数,代码块和静态代码块是按照什么顺序执行的,于是就构造了一个小实验来验证下。 先定义了Father类: package o...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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