对象初始化顺序
派生类的属性或字段----->基类的属性或字段----->基类的构造函数----->派生类的构造函数
a 先变量后构造函数
b 先静态化后实例化
c 先基类后派生类构造函数
c# viturl abstract override 的理解
virtual标识的方法是允许派生类重写此方法,基类方法中已经有方法体实现,派生类中采有override来标识,重写此方法;
abstract标识的方法是允许派生类重写此方法,基类方法中没有方法体实现,派生类中采有override来标识,重写此方法,抽象方法只能包含在抽象类中;
override标识的方法允许派生类重写此方法,基类方法是重写其父类的方法,派生类中采有override来标识,重写此方法;
派生类方法用NEW标识的,派生类方法隐藏基类的方法;
/*重载,覆盖,隐藏之间的区别
*
重载(overload)用于同一类中的成员函数,这个行为称为多态,其特征为:
* 1)在同一类中
* 2)相同的函数名
* 3)参数不同(包括参数类型不同,或参数个数不同,或两者都不同,注意:和返回值没关系)
* 4)和是否虚函数无关
覆盖(override)是指派生类函数覆盖基类函数,其特征为:
* 1)不同的范围(分别位于派生类与基类)
* 2)相同的函数名称
* 3)参数相同
* 4)基类函数必须是虚函数
隐藏(hide)是指派生类的函数屏蔽了与其同名的基类函数,其特征为:
* 1)不同的范围(分别位于派生类与基类)
* 2)相同的函数名
(3)若参数不同,基类函数无virtual关键字,基类函数将会被隐藏。(因为派生类和基类不在同一范围,所以是隐藏而不是重载);
()若参数不同,基类函数有virtual关键字。基类函数将会被隐藏。(因为派生类和基类不在同一范围,所以是隐藏而不是重载;因为参数不同,所以是隐藏而不是覆盖);
()若参数相同,基类函数无virtual关键字。基类函数将会被隐藏。(因为基类函数不是虚函数,所以是隐藏而不是覆盖)。
()若参数相同,基类函数有virtual关键字。如果基类函数有多个重载版本,且派生类并没有重写所有的同名虚函数,当在派生类中调用函数时,基类中未被重写的虚函数将被隐藏。(当然,被重写的函数就是覆盖了)。
* 注意: 如果想在派生类中调用基类中的被隐藏的函数,可以在派生类中填写如下代码:using Base::Fun2