Delphi中如何实现记录继承及纯虚函数(RAD Studio 10.2 Berlin)
在RAD Studio 10.2 Berlin中实现类似C++的记录继承与纯虚函数
一、模拟C++的结构体继承(接口实现)
Delphi原生record不支持继承,但你提供的C++示例中带纯虚函数的结构体本质是抽象基类,可通过Delphi的**接口(interface)**模拟这种继承关系:
type // 对应C++的struct A IA = interface ['{00000000-0000-0000-0000-000000000001}'] // 可通过Ctrl+Shift+G生成唯一GUID function ChangeName(const Name: PChar): Integer; stdcall; end; // 对应C++的struct B : public A IB = interface(IA) ['{00000000-0000-0000-0000-000000000002}'] function ChangeValue(const Value: PChar): Integer; stdcall; end;
说明:
- 接口天然支持继承,
IB继承IA后会包含IA的所有方法; PChar对应C的const char*,stdcall为调用约定,可根据C代码实际调用约定调整(如C++默认cdecl则对应Delphi的cdecl);- 接口中的所有方法均为抽象方法,必须由实现类重写,否则编译报错。
二、Delphi中实现纯虚函数
Delphi没有“纯虚函数”的术语,但可通过两种方式实现等价效果:
1. 接口方法(最贴近C++纯虚函数)
接口中声明的所有方法默认都是抽象的,必须由实现接口的类全部实现,行为完全等同于C++的纯虚函数——未实现所有接口方法的类无法通过编译,且接口本身不能直接实例化。
2. 抽象类的抽象方法
如果更倾向于用类而非接口,可定义抽象类,使用virtual; abstract;修饰方法,模拟纯虚函数:
type // 对应C++的抽象基类A TA = class abstract public function ChangeName(const Name: PChar): Integer; virtual; abstract; end; // 对应C++的抽象基类B : public A TB = class abstract(TA) public function ChangeValue(const Value: PChar): Integer; virtual; abstract; end;
说明:
class abstract标记该类为抽象类,无法直接实例化;virtual; abstract;修饰的方法无具体实现,子类必须重写这些方法才能被实例化,否则子类也需标记为abstract。
内容的提问来源于stack exchange,提问作者Ankush
相关产品推荐
相关产品推荐

