(一)在子类中使用new时,隐藏了父类同型函数,如果不用new编译器报警告。隐藏的效果是调用申明类型的函数定义执行,如:
class A
{
void Fun();
}
class B:A
{
new void Fun();
}
A a = new B();
A为申明类型,B为实例类型,则a.Fun()执行A.Fun(),如申明为B b = new B(); b.Fun()执行B.Fun();
无论父类函数是否有virtual修饰符,以上效果不变。
(二)override重写关键字必须与基类中virtual, abstract 或override使用,不可直接使用,否则编译报错。override效果是覆盖父类同型函数,覆盖的效果是执行实例类型的函数定义,如:
无论申明为A a = new B(),还是B b = new B(), 均执行B.Fun();
A为申明类型,B为实例类型,则a.Fun()执行A.Fun(),如申明为B b = new B(); b.Fun()执行B.Fun();
无论隐藏还是覆盖父类函数,均可以采用在子类中执行base.Fun()调用父类函数。
(三)重载发生在同一个类中同名不同型函数中。
(四)virtual函数可以执行,abstract类似于纯虚函数(pure virtual)不可执行,必须声明在抽象类中,否则编译报错;须在子类中实现才可以执行,而且必须实现,否则编译报错。由于抽象类不可实例化,所以只能执行子类的函数定义。