Borland / Delphi中用于替代__super关键字的方法

7

关键字__super是微软特定的。它用于访问父类的虚方法。你知道Borland C++/Delphi编译器的替代关键字吗?

class MyBaseClass
{
    virtual void DoSomething();
};

class MyDerivedClass : public MyBaseClass
{
    virtual void DoSomething();
};

void MyBaseClass::DoSomething()
{
    // some code
}

void MyDerivedClass::DoSomething()
{
    __super::DoSomething();  // calls implementation of base class - no need to know name of base class

    // implementation specific to derived class adding new functionality
}
3个回答

9
Delphi中的等效语句是inherited。据我所知,C++ Builder中没有相应的语句,当然__super是非标准的MS扩展。

C++ 2011标准仍然没有__super。你必须知道你的父类名称,这很糟糕,我个人认为。我喜欢“变量细节的非传播”这个想法。所以我猜,在C++ 2011中,你只需要typedef一次,就可以避免在整个单元中重复使用父类名称。 - Warren P
@WarrenP 在面对多重继承时,实现__super是棘手的。我相信C++之所以成为现在这个样子,一定有其良好的原因。 - David Heffernan
1
你知道吗?super关键字只能放在第一行,而inherited关键字可以在过程/函数体的任何行中调用。 - none
这个相关的问题展示了 __super 的另一种替代方式(还提到了伟大的书《C++的设计与演化》,我曾经拥有但被我的狗吃了。):https://dev59.com/43VC5IYBdhLWcg3wykej - Leonardo Herrera
@LeonardoHerrera 我现在桌子上就有那本书。你的狗很有品味!! - David Heffernan

8
  • Delphi:通过 inherited MyMethod(MyParam); 或简写的 inherited; 来继承方法。
  • C++Builder:通过 MyBaseClass::MyMethod(MyParam); 实现。

我同意,这并不完全相同。我不知道C++Builder中是否有等效的方法,但你可以声明一个typedef - Ondrej Kelle
1
一个每单位的 typedef TMyParentClassName __super 比在你的 .cpp 文件中重复十几次 TMyParentClassName 还要少。 - Warren P
@WarrenP,typedef必须是每个类别而不是每个单元。 - Remy Lebeau
1
@remy 因为你违反了DRY原则。想象一下在 MyBaseClass 和 MyDerivedClass 之间插入另一个类。Inherited 或 __would 能找到它,但硬编码的 C++ 代码不能。 - David Heffernan
@DavidHeffernan: 我不知道 DRY 是什么意思。无论如何,如果 MyDerivedClass 派生自 MyBaseClass,那么调用 MyBaseClass::DoSomething() 就可以了。如果 MyDerivedClass 后来改为从其他类派生,则必须相应地更新 MyBaseClass:: 引用。在 MyDerivedClass 内部使用 typedef,即:class MyDerivedClass : MyBaseClass { typedef MyBaseClass inherited; ... }; 并调用 inherited::DoSomething(),可以减轻这种影响。然后,当更改 MyDerivedClass 的祖先时,您只需要更新一行代码。 - Remy Lebeau
显示剩余3条评论

3
在Delphi中,相当于inherited。您可以在RTL和VCL源代码中看到其使用示例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接