第三节 abstract C: 没有. C++: abstract class是抽象类,至少包含一个纯虚函数的类就叫做抽象类。但是如果一个类,所有的成员都是纯虚函数,那么它和一般的抽象类在用法上是有区别的。至少Microsoft给的COM接口定义全部都是仅由纯虚函数构成的类。因此把这样的类定义叫做纯虚类也不算错。纯虚函数和虚函数的区别在于前者不包含定义,而后者包含函数体。那么纯虚类就是不包含任何实现(包括成员函数定义和成员变量定义。前者代表算法,后者代表结构)。不包含任何算法和结构的类叫做纯虚类,应该没有问题。justforfun626说我confused with the name of abstract class,那是因为在Java里面的确没有纯虚类的概念,因为Java里没有纯虚函数这个概念。Java管虚函数叫做abstractfunction,管抽象类叫做abstract class,直接说来,Java根本没有virtual这个关键字,都用abstract代替,因此Java里面根本就没有Pure这个概念。有那就是interface。在interface里面定义的函数都不能有函数体,这个在Java里面叫做接口。 关于C++纯虚函数和抽象类的描述中,下面哪个是错误的? 答案:A和C.A中,纯虚西沟函数必须提供一个函数题,C中可能派生类并没有将基类中所有的 纯虚函数实例化. 关于纯虚析构函数. (1).必须为纯虚析构函数提供一个函数体,因为编译器和链接程序强迫纯虚析构函数一定要有一个函数体,. (2).不像其它的纯虚函数,我们不要求在派生类中提供纯虚函数的定义. (3).如果派生类不进行析构函数的定义,编译器会自动地为每个类生成一个析构函数定义,即自动被重写,因此类中的纯虚函数只有析构函数时,派生类不会成为抽象类 (4).当我们的类仅含有一个纯虚函数(纯虚析构函数)时,.体现了纯虚析构函数的唯一作用,阻止基类被实例化,所以当基类包含很多纯虚函数时,定义纯虚析构函数作用不大了. (5).析构函数从”外层”(从最晚派生的析构函数向基类析构函数)被调用. JAVA: 虚函数用abstract声明,含有虚函数的类是抽象类,也要用abstract关键字修饰。 //Java Code
(1)java没有”纯”(虚函数)这个概念,java中都用abstract(抽象函数,抽象类)来代替.其实java中抽象类就相当于c++中抽象类,java中的抽象函数就相当于c++中的纯虚函数,都不包括定义.只不过java的抽象类指包含抽象函数的类,c++中抽象类指至少包含一个纯虚函数(纯虚函数也算在内)的类,并且同c++一样要在类前添加abastract修饰符. (2).c#对抽象类的定义同java相同,但是c#却有virtual关键字.c#与c++和java不同是继承限制比较大,必须添加修饰符override或new,而c++和java都不需要,这点上c++和java又不谋而合. |