定义一个类A, 然后定义一个类B继承自类A,此时A为父类(基类),B为子类(派生类)。
称B继承自A,A派生出B。
此时B继承 A的非私有部分。对于A的私有部分,是不能被继承的。
A的构造函数:
public A(string n)
{
name = n;
}
B的构造函数:
public B(string name)
: base(name)
{
}
通过base(name)将构造函数B获取的内容传递给A的构造函数。
子类存在和父类一样的函数时,子类会调用子类自己的函数。
多态:
对于类A和B。可以定义一个父类A的引用指向B类的对象。但是不能定义子类B的引用指向父类A的对象,这样做在运行时会抛出异常。
类A派生出类C,C也是A的一个子类。B和C的引用不能相互指向对方,这样做语法上就是错误的。
基类引用指向派生类对象是,父类引用只能调用子类继承自父类的成员。对于子类定义的成员,不能被调用。可以调用子类重写父类的方法,而不是父类的方法。
派生类存在和父类一样的函数时,派生类的引用调用派生类的成员函数。
基类的引用指向派生类时,调用基类自己的成员函数。如果想让基类y引用调用派生类的成员,需要把基类的函数声明为虚函数virtual,说明该函数可以在子类中被重写,此时,派生类的该函数加override,这样可以就是子类重写了父类的函数,基类指针调用时,调用的就是子类的函数。如果没有加override,默认就是覆盖的。
注意事项:
virtual和override不能用在private方法上。
重写的方法必须同名,参数列表一致,返回值类型一致。
拥有相同的访问级别。
· 只能重写虚方法。
已经用override定义的方法,不能再用virtual定义,原因是因为加了override,是重写父类的函数,同时也将父类的虚函数特性继承过来了,所以子类B继续派生子类C时,C还可以对B重写过的函数进行重写,如果子类B不加override,相当于重新定义(覆盖),此时C不能重写B的该函数,除非B的该函数加virtual。
对于父类的虚函数,子类定义有相同函数时,默认为隐式加new(重新定义,覆盖),如果加了override,就是重写。
protected:保护成员属性。不能再类的外部被访问,但是可以在子类内部访问。