新闻资讯
看你所看,想你所想

导出类

导出类

当A类继承B类时,A被称为导出类(derived class),派生类,继承类,子类。B类称基类、超类或父类。

基本介绍

  • 中文名:导出类
  • 外文名:derived class
  • 别名:派生类、继承类、子类
  • 另一个类称:父类、基类或超类
  • 加速:procedure Init;

定义

当一个类继承另一个类时,这个类被称为导出类,继承类或子类,另一个类称父类、基类或超类。例如Turbo Pascal 5.5及以上版本中有如下语句(其中儘管大小写不敏感,但仍然推荐大小写交错以增加程式可读性):
type
Movement=object
Direction:0..360;{方向}
Speed:0..400;{速度}
SpeedChange:-10..10;{速度改变}
procedure Init;{初始化}
procedure Accelerate;{加速}
procedure Decelerate;{减速}
end;
AirStatus=object(Movement)
Altitude:0..35000;{高度}
AltChange:-100..100;{高度改变}
procedure Init;{初始化}
procedure Ascend;{爬升}
procedure Descend;{下降}
end;
在AirStatus的定义中,由于包含了对Movement的引用,所以除了新定义的数据栏位Altitude,AltChange和方法Ascend,Descend外,AirStatus还继承了Movement的所有数据和方法。(如Direction,Speed,Accelerate等)
用OOP的术语来说,“Movement”为“祖先”类型,“AirStatus”是其一个“后代”类型。他们的关係叫做“继承”或“对象继承”。

导出类的使用方式

导出类的简单方式

这种方式是比较简单的,同时也是不建议採用的不合适方式。
只需要在导出类加上__declspec(dllexport),就可以实现导出类。对象空间还是在使用者的模组里,dll只提供类中的函式代码。不足的地方是:使用者需要知道整个类的实现,包括基类、类中成员对象,也就是说所有跟导出类相关的东西,使用者都要知道。通过Dependency Walker可以看到,这时候的dll导出的是跟类相关的函式:如构造函式、赋值操作符、析构函式、其它函式,这些都是使用者可能会用到的函式。
这种导出类的方式,除了导出的东西太多、使用者对类的实现依赖太多之外,还有其它问题:必须保证使用同一种编译器。导出类的本质是导出类里的函式,因为语法上直接导出了类,没有对函式的调用方式、重命名进行设定,导致了产生的dll并不通用。

导出类的较好方式

这种方式是比较合适的,跟com类似。
结构是这样的:导出类是一个派生类,派生自一个抽象类——都是纯虚函式。使用者需要知道这个抽象类的结构。DLL最少只需要提供一个用于获取类对象指针的接口。使用者跟DLL提供者共用一个抽象类的头档案,使用者依赖于DLL的东西很少,只需要知道抽象类的接口,以及获取对象指针的导出函式,对象记忆体空间的申请是在DLL模组中做的,释放也在DLL模组中完成,最后记得要调用释放对象的函式。
这种方式比较好,通用,产生的DLL没有特定环境限制。藉助了C++类的虚函式。一般都是採用这种方式。除了对DLL导出类有好处外,採用接口跟实现分离,可以使得工程的结构更清晰,使用者只需要知道接口,而不需要知道实现。

总结

导出类是比较简单的,比较容易混淆的概念上一篇总结已经说完了。本质上来说,跟导出函式没差别。
使用VS2005自动生成的代码可以省去很多力气,比起以前做练习什幺都是自己动手写方便多了。要注意一下工程的设定,熟悉它们的作用可以加快编程速度。

转载请注明出处安可林文章网 » 导出类

相关推荐

    声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:fendou3451@163.com