先看代码,写出结果

class A
     {
          public A()
           {
                PrintFields();
           }
          public virtual void PrintFields(){}
      }
      class B:A
      {
           int x=1;
           int y;
           public B()
        {
               y=-1;
           }
           public override void PrintFields()
           {
               Console.WriteLine("x={0},y={1}",x,y);
           }

}

问题,当执行如下代码时,输出的结果是多少?
B b =new B();
b.PrintFields();

基本原理:一个带有基类的类型的构造顺序是:先执行成员变量的初始化表达式,然后执行父类的构造,最后调用自己的构造方法。
所以,结果是

再举一个例子,加深对这个原理的印象
先看继承结构
public class Ref
    {
        public Ref(string s)
        {
            Console.WriteLine(s);
        }
    }
    public class Base
    {
        public Ref basestring = new Ref("Base初始化表达式");
        public Base()
        {
            Console.WriteLine("Base构造方法");
        }
    }
    public class A:Base
    {
        public Ref astring = new Ref("A初始化表达式");
        public A():base()
        {
            Console.WriteLine("A构造方法");
        }
    }
    public class B : A
    {
        public Ref bstring = new Ref("B初始化表达式");
        public B(): base()
        {
            Console.WriteLine("B构造方法");
        }
    }
    public class C : B
    {
        public Ref cstring = new Ref("C初始化表达式");
        public C(): base()
        {
            Console.WriteLine("C构造方法");
        }
    }

调用如下代码的输出是
C c = new C();

最后,向你推荐这个小工具,可以运行片断式的代码,而不用打开Visual Studio 启动一个工程

如果你怀疑自己的判断,拿起这个小工具,执行一下代码,就明白了。

转载于:https://www.cnblogs.com/JamesLi2015/archive/2010/02/02/1661768.html

在一个类型的继承体系中,成员的构造顺序相关推荐

  1. c++类中成员的构造顺序

    先是父类各成员的初始化, 各成员的默认构造函数, 再调用父类的构造函数,然后是各成员的初始化, 各成员的默认构造函数,然后是自己的构造函数. class a { public:     a()     ...

  2. C++编程进阶5(内联函数、如何降低编译成本、处理继承体系中同名不同参的成员函数、私有虚函数)

    十七.内联函数 在https://blog.csdn.net/Master_Cui/article/details/106391552中,已经简单的说过内联函数的作用. 函数体较小的内联函数经过编译后 ...

  3. 关于虚继承(在钻石继承体系中,一定要用虚继承!)

    在钻石继承体系中,一定要用虚继承! 1.下面的代码块儿无法通过编译,原因是,A3无法确定自己到底是用哪一个父类中的函数. class A { public: virtual void f(){} vi ...

  4. 浅谈c++中继承体系中易错点

    浅谈c++中继承体系中易错点 目前,就我工作经验来看,在c++中继承体系中总爱搞错的有两点: 不把基类中需要覆盖的方法为设置为虚方法. 不把基类中的析构函数设置为虚方法. 就第一点而言,如果基类中需要 ...

  5. C++继承体系下的对象构造

    继承体系下的对象构造 继承下的对象构造 虚拟继承 初始化"虚基类子对象" vptr的设置 总结 继承下的对象构造 class Point{public:Point(float x ...

  6. C++学习笔记-----继承体系中函数的重载,覆盖和隐藏的区别

    1.重载,在同一个作用域中定义的同名不同参的一些函数为重载. 2.隐藏,若在基类中定义了某一non_virtual函数,在派生类重存在同名函数(不需要参数列表相同),基类的该函数在派生类中是不可见的, ...

  7. C++中对象的构造顺序和析构顺序

    文章目录 1 C++中单个对象的构造和析构顺序 1.1 单个对象的构造和析构顺序 2 C++中多个对象的构造和析构顺序 2.1 局部对象的构造顺序 2.2 堆对象的构造顺序 2.3 全局对象的构造顺序 ...

  8. java继承链中方法调用优先级.顺序:this.show(object)super.show(object)this.show((super)object)super.show((super))

    先看代码如下: 运行结果 在上述代码中,类B继承了类A,类C继承了类B,A中show()方法发生了重载,B中重写了A中的show(C )方法. 这里先说一下向上造型的一个知识点:向上造型时,编译期时根 ...

  9. JAVA 【引用类型】和【对象类型】在【继承】中的异同

    介绍 JAVA [引用类型]和[对象类型]在[继承]中的异同.这个问题自己整理过N次.也被人当菜鸟问过N次.所以,在此简单整理一下.以供大家分享. 在继承关系中.一般成员变量是依据引用类型 在继承关系 ...

最新文章

  1. 删数据,还要删AI模型:美国科技公司遭遇最严厉隐私泄露处罚
  2. 厦大AI研究院今日揭牌成立:数学系校友陈纯院士领衔
  3. 网络营销专员浅析在网络营销推广中有不少渠道可适当“利用”一下
  4. 我的10年富士康故事
  5. java后端面试笔记-自用
  6. JEECG 3.7 新装亮相,移动APP发布
  7. 今晚直播丨手把手安装搭建GoldenDB
  8. android两种基本联网方式与一种第三方开源项目的使用
  9. OpenStack_I版 5.Nova部署
  10. 自定义UITabBarController以及UITabBar的分析
  11. 在阿里云上搭建自己的git服务器
  12. VC6.0安装番茄助手
  13. 硬盘安装Fedora 9成功
  14. 【C语言自学】第三章流程控制
  15. 车市冷车道 这6款紧凑车苦坐板凳寻伯乐(一)
  16. linux mysql删除恢复,如果不小心把mysql的权限表删除了恢复方法
  17. 爱加密so VMP浅析
  18. $reday和window.onload()
  19. Web前端大作业——基于HTML+CSS+JavaScript仿英雄联盟LOL游戏网站
  20. 批处理——提取SRT文字中的文字

热门文章

  1. 阿加莎·克莉丝蒂与我们
  2. php 四舍五入百位,php取整函数ceil,floor,round,intval函数的区别
  3. hadoop学习1 java操作HDFS
  4. 洛谷模板,树状数组二 差分
  5. OpenCV-Python 中文教程(搬运)目录
  6. java 解决汉诺塔问题
  7. ASP.NET Aries 3.0发布(附带通用API设计及基本教程介绍)
  8. ITFriend创业败局(四):菜鸟CEO的自我修养
  9. PHP使用文件流下载文件方法(附:解决下载文件内容乱码问题)
  10. ASP.NET跨页面传值技巧总结