2011-05-18 58 views
2

请告诉我,如果有手动执行特定__super宏微软的方式...是否可以实现__super宏?

+5

请让我们知道__super宏的作用。 – 2011-05-18 07:12:05

+3

其实'__super'不是一个宏,而是一个关键字 - http://msdn.microsoft.com/en-us/library/94dw1w7x(v=vs.80).aspx – sharptooth 2011-05-18 07:12:20

+0

@Neil:http:// msdn。 microsoft.com/en-us/library/94dw1w7x.aspx – Xeo 2011-05-18 07:12:42

回答

7
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(); 
    } 
}; 

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

一个缺点:整个结构爆炸与多个基类。 :/

+0

谢谢,Xeo! – Ryan 2011-05-18 07:30:25

+1

@Ryan:typedef的一个很好的副作用是,你可以在初始化列表中使用它,而不是(可能很长)的基类名。 :) – Xeo 2011-05-18 07:32:01

+0

从模板参数的类继承时,我使用'typedef'技巧(没有额外的中间体)几次。 DRY在工作中...(或几乎,因为你需要重复一次)。 – 2011-05-18 07:34:06

3

避免它,它使你的代码不可移植。如果你想有一个简短的名称为您的基类,然后使用一个typedef:

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

关键字super实际上是提出了一个漫长而早在C++标准化进程,但却遭到拒绝不必要的,因为它可以可以用Xeo在他的回答中描述的方法来实现 - 这在Stroustrup的D & E书中有介绍。我想微软认为它确实是必要的,但是如果你使用它,会被警告你的代码将不能移植。

+0

您无法仿效'__super'关键字的一个好处是它考虑了所有基类。 – Xeo 2011-05-18 07:21:32

+0

@Xeo:这是一个让代码更麻烦一点的问题......您可以编写一个适配器模板,它将继承所有基类,并为每个基类添加一个'using X :: func;'; X'。那么大多数派生类只需要从该适配器继承。如果你把它叫做'super',那么语法:'super :: func'将会派发给直接的父对象,这将会有'using'声明并且会考虑所有的基类。还有太多的复杂性,没有多少收获。 – 2011-05-18 07:38:21

+0

@大卫:虽然这是一个有趣的想法,谢谢你。但你是对的。您不能将这样的适配器作为简单的混合,它需要为每个层次结构进行手动编码。 :/ – Xeo 2011-05-18 07:39:53

相关问题