一、继承的特点:
1、子类拥有父类的属性和方法
2、子类可以有自己新的属性和方法
3、子类可以重写(覆盖)父类的方法
4、可以声明父类,创建子类
(1)声明的什么类型,就只能调用本类型的属性和方法
(2)创建的什么类型,运行什么类型的方法
(3)创建的什么类型,就可以强转为什么类型
二、 THIS 与 SUPER 关键字
其实this 与super 很简单,this 表示调用自己声明的属性和方法,super表示调用父类声明的属性和方法。
三、继承中的构造方法
1、创建对象一定会调用构造方法
2、创建子类对象一定会调用父类的构造方法
3、子类默认调用父类无参构造方法
4、子类只能调用父类存在的构造方法
5、子类构造方法中使用super 调用父类构造方法,并且super 必须放在第一行
6、构造方法中this 表示调用本类其他构造方法,并且this 必须放在第一行
四、多重继承
class D:public A,private B,protected C
{ 类D新增加的成员}
1、多继承引起的二义性问题
B、C两个类中含有相同的函数a(),当类D d,d.a();调用时,就不知调用哪个,这里用作用域符号“::”解 决这个问题,d.B::a() 或者d.A::a()
2、多继承引起派生类的多次继承——解决办法:定义为虚基类
类D继承了类A两次,分别通过类B和类C。把类A声明成虚基类,类D就继承了类A一次。
一般形式:class 派生类名:virtual 继承方式 基类名
五、基类和派生类的转换
既然数据类型之间可以类型转换,那基类和派生类之间也可以转换
1、派生类对象可以向基类对象赋值
可以用子类对象对基类对象赋值,如
A a1; //定义基类A对象a1
B b1; //定义类A的公用派生类B的对象b1
a1=b1; //用派生类B对象b1对基类对象a1赋值
2、派生类对象可以替代基类对象向基类对象的引用进行赋值或初始化
如:
A a1; //定义基类A对象a1
B b1; //定义公用派生类B对象b1
A&r=a1; //定义基类A对象的引用r,并用a1对其初始化
3、如果函数的参数是基类对象或基类对象的引用,相应的实参可以用子类对象
4、派生类对象的地址可以赋给指向基类对象的指针变量,也就是说,指向基类对象的指针变量也可以指向派生类 对象。
六、装饰模式中的继承
服饰类
class Finery : Person
{
protected Person component;
public void Decorate(Person component)
{
this.component = component;
}
public override void Show()
{
if (component != null)
{
component.Show();
}
}
}
T恤类
class TShirts : Finery
{
public override void Show()
{
Console.Write("大T恤");
base.Show();
}
}
垮裤类
class BigTrouser : Finery
{
public override void Show()
{
Console.Write("垮裤");
base.Show();
}
}
}
垮裤类和T恤类都继承了服饰类,垮裤类和T恤类都拥有Decorate()方法,两个类都拥有的了此类但是其两个方法是完全没有关系的里边的内容也是没有关系的,继承减少了代码量,使代码更加简单。