1.说明继承、重载、覆盖、隐藏和多态的区别。
2.说明C#中多态的条件。
3.说明派生类对象的链式构造和析构过程。
4.什么是密封类和密封方法。
5.Base关键字如何使用。对应与c++是怎么调用基类被隐藏的函数的?
2.说明C#中多态的条件。
3.说明派生类对象的链式构造和析构过程。
4.什么是密封类和密封方法。
5.Base关键字如何使用。对应与c++是怎么调用基类被隐藏的函数的?
平时代码写了不少,但是一些概念性的问题,不是很清楚,理解不够
2.说明C#中多态的条件。
3.说明派生类对象的链式构造和析构过程。
4.什么是密封类和密封方法。
5.Base关键字如何使用。对应与c++是怎么调用基类被隐藏的函数的?
MSDN一一有描述和實例,
答:
继承:派生类可以继承除了基类的构造函数和析构函数以外的所有的成员。
重载:函数的参数个数或参数类型不同的而函数名相同的函数称重载。根据参数的不同自动匹配调用。
覆盖/隐藏:
(1)成员变量的覆盖:如果派生类声明了一个和基类同名的成员变量,就是覆盖了基类成员。
(2)成员函数(方法)的覆盖:实际上可以分为两种:普通方法(非虚函数)的覆盖称为隐藏,声明时在派生类中函数头前用关键词new,不能与override同时用;另外一种,就是虚方法的覆盖,真正意义上的函数覆盖。基类中的函数用关键词virtual,派生类中用override。
多态:同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的执行结果。基类对象指向派生类对象,基类对象调用虚函数时体现多态,会在运行时决定调用哪个类的函数,即运行时多态。
实际上,只有虚函数才有多态,成员变量不具多态的能力,非虚函数的覆盖函数(即所说的隐藏)在编译时就确定其调用者,即编译时多态,但没有多态的体现。 说明C#中多态的条件。
答:
基类引用指向派生类对象,调用virtual函数,根据运行时确定指向的对象决定调用基类的还是派生类里的函数,实现多态。
只有虚函数的覆盖才有多态的能力,成员变量不具有多态的能力。 说明派生类对象的链式构造和析构过程。
答:
实例化一个派生类的对象时,派生类构造函数在执行它自己的函数体之前,会显示或隐式地调用基类构造函数。
当析够一个派生类对象时,顺序与构造函数执行的顺序相反。先析构自己再析构基类;
N个对象的析构与构造的顺序相反。 什么是密封类和密封方法。
答:
密封类:不允许别的类继承的类。类声明的前面加关键字sealed。
密码方法:对方法可以使用sealed修饰符,这是称该方法是一个密封方法。密封方法是以防止在方法所在类的派生类中对改方法的重载。密封方法必须对基类的虚方法进行重载,提供具体的实现方法。 Base关键字如何使用。对应与c++是怎么调用基类被隐藏的函数的?
答:
C#中:
Base一般用在派生类中(或派生类对象)调用基类的函数或成员时为了区分基类和派生类同名的成员(如成员函数的覆盖或是继承来的成员变量的隐藏);一般格式为: Base.fuction() 或者Base.x (其中function()是基类的成员函数,x是基类的成员变量)。
Eg:
Master从Student派生来,fn()是Student中的函数
Master a;
a.base.fn();
C++中:
对应在c++中格式为:father::function()或者father::x.(father是基类)
Eg: a.Student::fn(); abstract类与具体类的区别,abstract类的作用是什么?
答:
与具体类区别在于:
 抽象类只能作为其它类的基类,它不能被直接实例化,而且对抽象类不能使用new操作符。
 抽象类不能同时又是密封的。
作用:为它的派生类提供一个公共的界面。 interface与abstract类的区别,interface的作用是什么?
答:
区别在于:
 接口继承允许多继承,一个接口可以有多个父接口;而抽象类和普通类只能有一个父类。
 接口里面的只是对函数的说明不包含任何实现(即使是空的{}都不行;而抽象类可以包含部分方法的实现。
 接口一旦创建了就不能更改。
 接口成员声明不能包含很和修饰符。默认的为public.
 实现接口必须实现接口中的所有方法,而继承抽象类的子类可以还是抽象类,可以只实现部分方法。
作用:在组件和组件之间、组件和客户之间都通过接口进行交互。