多继承的构造顺序

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

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

多继承时的构造函数调用的顺序

调用顺序是:虚基类——直接基类——子对象——派生类 我们假设一个非常复杂的情况: class A; class B: virtual public A; class C: virtual public...

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

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

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

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

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

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

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

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

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

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

派生类构造函数举例(多继承、含有内嵌对象)

#include using namespace std; class B1 { public: B1(int i){cout
  • jkhere
  • jkhere
  • 2013年04月07日 10:01
  • 1141

python3 多继承和MRO顺序

# coding=utf-8 print("******多继承使用类名.__init__ 发生的状态******") class Parent(object): def __init__(s...

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

单继承情况 (1)子类默认无__init__时,则会直接继承父类__init__ #!/usr/bin/env python #coding=utf-8 class BaseClass: ...
  • cjh3353
  • cjh3353
  • 2015年08月11日 20:59
  • 1045

【C/C++学院】0822-类型转换函数与构造转换函数/类的继承/类的继承以及区别/继承静态成员与静态函数//继承实现代码重用/单继承QT案例/多继承简介以及实战/Gpu编程

类型转换函数与构造转换函数 #include class fushu { public: explicit fushu(int num)//避免隐式转换,引发歧义 { x = num; ...
  • waldmer
  • waldmer
  • 2015年10月29日 08:18
  • 1520
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多继承的构造顺序
举报原因:
原因补充:

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