四种编程语言的异同 -第三节abstract之c.c++.java

来源:互联网 发布:ubuntu安装极点五笔 编辑:程序博客网 时间:2024/06/06 05:15

第三节 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,纯虚函数是一种特殊的虚函数,它没的具体的实现. 
B,抽象类是指具有纯虚函数的类. 
C,一个基类中说明有纯虚函数,该基类的派生类一定不再是抽象类. 
D,抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出.

答案:A和C.A中,纯虚西沟函数必须提供一个函数题,C中可能派生类并没有将基类中所有的 纯虚函数实例化.

关于纯虚析构函数.

(1).必须为纯虚析构函数提供一个函数体,因为编译器和链接程序强迫纯虚析构函数一定要有一个函数体,.

(2).不像其它的纯虚函数,我们不要求在派生类中提供纯虚函数的定义.

(3).如果派生类不进行析构函数的定义,编译器会自动地为每个类生成一个析构函数定义,即自动被重写,因此类中的纯虚函数只有析构函数时,派生类不会成为抽象类

(4).当我们的类仅含有一个纯虚函数(纯虚析构函数)时,.体现了纯虚析构函数的唯一作用,阻止基类被实例化,所以当基类包含很多纯虚函数时,定义纯虚析构函数作用不大了.

(5).析构函数从”外层”(从最晚派生的析构函数向基类析构函数)被调用.

JAVA:

虚函数用abstract声明,含有虚函数的类是抽象类,也要用abstract关键字修饰。

//Java Code
public abstract AbstractClass
{
   public abstract void hello();
   //…
}

 


总结:

(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又不谋而合.

原创粉丝点击