多重继承、接口的优缺点分别是什么?Delphi为什么选择接口?

ooolinux 2022-11-10 19:22:42

如题

...全文
139 30 打赏 收藏 举报
写回复
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
YiYanXiYin 2022-11-23
  • 打赏
  • 举报
回复

主要是风险规避, delphi , java之类的语言更易用就在于给开发人员规避了一些风险, 虽然丧失了一些灵活性,但更好用了
比如说A同时继承B,C但是B,C两个类同时拥有相同原型的两个函数,那么在A实例话时候调用该function时候就可以存在问题,故不提倡类的多重继承,所以多重继承用接口相对安全,可以避免很多因为原型相同在继承时候出现不必要的潜在危险

ooolinux 2022-11-23
  • 举报
回复
@YiYanXiYin 有道理
  • 举报
回复
@YiYanXiYin 这个不是问题,可以通过类前缀来区分继承来的同名同型成员,x.B::f()、x.C::f()之类的,连这么基本的名字冲突都解决不了的话,多重继承就不会出现
  • 打赏
  • 举报
回复

@ooolinux
如果这书说了多重继承的派生类也只有一个VMT(vtable)的话,那肯定是错的。
应该是每个VMT指针在实例中的偏移位置不固定(除了第一个VMT指针和单继承的实例布局一样位于偏移0),不是只有一个VMT。
就我看到,各个C++编译器生成的实例布局都是这样的:
第一个VMT指针
第一个基类的数据
第二个VMT指针 //
第二个基类的数据 //
... // 单继承就没有这些了
派生类自己的数据
另外,派生类新增的虚函数,其函数指针会附加在第一个VMT的后部(和单继承的情况一样)

ooolinux 2022-11-16
  • 举报
回复
@日立奔腾浪潮微软松下联想 应该是这样,我忘记了。VMT中只有虚函数表项吗?普通成员函数偏移地址写在哪里?
  • 举报
回复
@ooolinux 非虚函数的调用不具有多态性,也就不需要用表保存了,直接调用地址,和全局函数的调用一样
ooolinux 2022-11-16
  • 举报
回复
@日立奔腾浪潮微软松下联想 非静态成员函数跟this指针有关,编译器直接算出函数地址?
2条回复
  • 打赏
  • 举报
回复

确实是不同类别的概念,与接口类似的是抽象类。
但是单继承的类架构,通过实现多重接口,可以模拟多重继承,于是两者也就有了联系。
在Delphi中还有一个接口委托实现机制,每个接口可以只实现一次,其他实现该接口的类都可以通过一个实现该接口的对象(实例)来委托实现,就好像自己也把该接口实现了一样。这样可以减少很多代码,而且能够减缓多重继承的类膨胀问题。
D6之前,接口是对应Windows COM接口的架构设计的,但是从D6开始,已经是独立的语言特性。

ooolinux 2022-11-11
  • 举报
回复
@日立奔腾浪潮微软松下联想 多重继承的缺点就是类膨胀吗?从不同路径得到两份基类的共同基类之成员?
  • 举报
回复
@ooolinux 你说的是菱形继承(钻石继承),这个实际上可以通过虚继承来解决,但是也有副作用。即便不是菱形继承,多重继承也会导致类膨胀更快,这是显然的。
tanqth 2022-11-11
  • 举报
回复
@ooolinux 你这个应该是其中的一个关键点。Delphi严格说不支持多重继承,这个应该不是因为技术难度原因,而是考虑到可维护和更清晰的设计因素。
13条回复
墨梅无痕 2022-11-11
  • 打赏
  • 举报
回复

多重继承(我认为你指的是类的多重继承)就好比你从几个师父那里习得武功,堪称绝世高手;但是如果你同时修习《九阳神功》和《九阴真经》,却没有习得《易筋经》,那这两门特性相冲的内功将使你爆体而亡。
接口就很简单、规范、通用,与功能的实现没有关系,优点同时也是缺点,如果你不能掌控接口的参数类型,同样要爆体而亡。
似乎只有C++采用了类的多重继承,而其他语言都选择了接口多重实现,原因无怪乎类的多重继承过于复杂,而接口更易实现。
臆测,Delphi选择接口还与 Windows 的 COM 机制有关。

ooolinux 2022-11-11
  • 举报
回复
@墨梅无痕 “爆体而亡”这个比喻不是很懂,能用简单代码说明一下吗?
tanqth 2022-11-10
  • 打赏
  • 举报
回复

你这两个内容,根本就不能作对比,完全是不同的东西。

ooolinux 2022-11-11
  • 举报
回复
@tanqth 有关系
相关推荐
发帖
Delphi

5179

社区成员

Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
帖子事件
创建了帖子
2022-11-10 19:22
社区公告
暂无公告