在一个类型的继承体系中,成员的构造顺序
先看代码,写出结果
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
在一个类型的继承体系中,成员的构造顺序相关推荐
- c++类中成员的构造顺序
先是父类各成员的初始化, 各成员的默认构造函数, 再调用父类的构造函数,然后是各成员的初始化, 各成员的默认构造函数,然后是自己的构造函数. class a { public: a() ...
- C++编程进阶5(内联函数、如何降低编译成本、处理继承体系中同名不同参的成员函数、私有虚函数)
十七.内联函数 在https://blog.csdn.net/Master_Cui/article/details/106391552中,已经简单的说过内联函数的作用. 函数体较小的内联函数经过编译后 ...
- 关于虚继承(在钻石继承体系中,一定要用虚继承!)
在钻石继承体系中,一定要用虚继承! 1.下面的代码块儿无法通过编译,原因是,A3无法确定自己到底是用哪一个父类中的函数. class A { public: virtual void f(){} vi ...
- 浅谈c++中继承体系中易错点
浅谈c++中继承体系中易错点 目前,就我工作经验来看,在c++中继承体系中总爱搞错的有两点: 不把基类中需要覆盖的方法为设置为虚方法. 不把基类中的析构函数设置为虚方法. 就第一点而言,如果基类中需要 ...
- C++继承体系下的对象构造
继承体系下的对象构造 继承下的对象构造 虚拟继承 初始化"虚基类子对象" vptr的设置 总结 继承下的对象构造 class Point{public:Point(float x ...
- C++学习笔记-----继承体系中函数的重载,覆盖和隐藏的区别
1.重载,在同一个作用域中定义的同名不同参的一些函数为重载. 2.隐藏,若在基类中定义了某一non_virtual函数,在派生类重存在同名函数(不需要参数列表相同),基类的该函数在派生类中是不可见的, ...
- C++中对象的构造顺序和析构顺序
文章目录 1 C++中单个对象的构造和析构顺序 1.1 单个对象的构造和析构顺序 2 C++中多个对象的构造和析构顺序 2.1 局部对象的构造顺序 2.2 堆对象的构造顺序 2.3 全局对象的构造顺序 ...
- java继承链中方法调用优先级.顺序:this.show(object)super.show(object)this.show((super)object)super.show((super))
先看代码如下: 运行结果 在上述代码中,类B继承了类A,类C继承了类B,A中show()方法发生了重载,B中重写了A中的show(C )方法. 这里先说一下向上造型的一个知识点:向上造型时,编译期时根 ...
- JAVA 【引用类型】和【对象类型】在【继承】中的异同
介绍 JAVA [引用类型]和[对象类型]在[继承]中的异同.这个问题自己整理过N次.也被人当菜鸟问过N次.所以,在此简单整理一下.以供大家分享. 在继承关系中.一般成员变量是依据引用类型 在继承关系 ...
最新文章
- 删数据,还要删AI模型:美国科技公司遭遇最严厉隐私泄露处罚
- 厦大AI研究院今日揭牌成立:数学系校友陈纯院士领衔
- 网络营销专员浅析在网络营销推广中有不少渠道可适当“利用”一下
- 我的10年富士康故事
- java后端面试笔记-自用
- JEECG 3.7 新装亮相,移动APP发布
- 今晚直播丨手把手安装搭建GoldenDB
- android两种基本联网方式与一种第三方开源项目的使用
- OpenStack_I版 5.Nova部署
- 自定义UITabBarController以及UITabBar的分析
- 在阿里云上搭建自己的git服务器
- VC6.0安装番茄助手
- 硬盘安装Fedora 9成功
- 【C语言自学】第三章流程控制
- 车市冷车道 这6款紧凑车苦坐板凳寻伯乐(一)
- linux mysql删除恢复,如果不小心把mysql的权限表删除了恢复方法
- 爱加密so VMP浅析
- $reday和window.onload()
- Web前端大作业——基于HTML+CSS+JavaScript仿英雄联盟LOL游戏网站
- 批处理——提取SRT文字中的文字