【问题标题】:Is it possible to implement the __super macro?是否可以实现 __super 宏?
【发布时间】:2011-05-18 07:10:27
【问题描述】:

请告诉我是否有办法手动实现 Microsoft 特定的 __super 宏...

【问题讨论】:

标签: c++ visual-c++ gcc macros


【解决方案1】:
class Base{
public:
  void func(){
    // something
  }
};

class Derived : public Base{
public:
  void func(){
    Base::func(); // just use the base class name
  }
};

虽然我认为这不是您想要的,并且您希望每个类都具有通用访问权限?我不知道直接的解决方案,但您始终可以typedef 您的直接基类:

class Derived : public Base{
  typedef Base super; // typedef accordingly in every class
public:
  void func(){
    super::func();
  }
};

如果你真的想要的话,甚至可以为 typedef 设置一个中间类。

template<class Base>
struct AddSuper : public Base {
protected:
  typedef Base super;
};

class Derived : public AddSuper<Base> {
public:
  void func(){
    super::func();
  }
};

请注意,您不应忘记在每个派生类中重新键入定义,否则您会在调用链中出现漏洞。

一个缺点:整个结构因多个基类而崩溃。 :/

【讨论】:

  • @Ryan:typedef 的一个很好的副作用是,您可以在初始化列表中使用它,而不是(可能很长)基类名称。 :)
  • 在从带有模板参数的类继承时,我已经使用了几次typedef 技巧(没有额外的中间体)。 DRY 在工作中......(或几乎,因为你需要重复一次)。
  • @Matthieu:我通常使用this_typeself_type 或类似MSVC MyType 为当前类执行此操作,特别是如果它是模板化的。它还为我所有的操作员带来了很好的统一性。 :) 另外,我认为如果没有这样的 typedef,模板类通常无法使用。
【解决方案2】:

避免它,它会使您的代码不可移植。如果你想为你的基类起一个短名称,那么使用 typedef:

class Derived: public BaseWithALongName
{
   typedef BaseWithALongName super;
};

【讨论】:

    【解决方案3】:

    关键字super 实际上早在 C++ 标准化过程中就提出了很长时间,但由于没有必要而被拒绝,因为它可以使用 Xeo 在他的回答中描述的方法来实现 - 这在 Stroustrup 的 D&E 书中有所介绍.我猜微软认为它确实是必要的,但是如果你使用它,你的代码将无法移植。

    【讨论】:

    • __super 关键字的一个好处是您无法模仿,它考虑了所有基类。
    • @Xeo:这只是让代码变得更麻烦...您可以编写一个适配器模板,该模板将从所有基类继承并为每个基类添加一个using X::func;X。然后最派生的类只需要从该适配器继承。如果你称它为super,那么语法:super::func 将分派给直接父级,它将具有using 声明并考虑所有基类。仍然太复杂而几乎没有收获。
    • @David:不过,这是一个有趣的想法,谢谢。但你是对的。您不能拥有像简单混合这样的适配器,它需要为每个层次结构手动编码。 ://
    猜你喜欢
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    相关资源
    最近更新 更多