了解空继承类的未使用的typedef

时间:2015-08-18 09:33:16

标签: c++ inheritance typedef

我只是想了解一些我正在经历的教程代码。我正在尝试学习一些Dx11代码,我正在经历的教程中有一些类,这些类被设计为在事件发生时传递给函数的事件细节,例如:按下鼠标按钮。有一个空的基类EventArgs定义如下:

class EventArgs
{
public:
    EventArgs() {};
}

其他事件(如类)继承了哪些内容。例如,他们有一个按键事件args类如下:

class KeyEventArgs : public EventArgs
{
public:
    typedef EventArgs base;
    KeyEventArgs(/**/)
    { }

    // Rest of the class
}

我理解前提是所有事件都继承了一个基础来说“它们是一个事件类型”,但我不理解每个事件类中的typedef基础,但它们不直接使用它们。似乎一个带有KeyEventArgs参数的函数使用这个base typedef将事件传递给它自己的基类,但我不明白它是如何工作的。他们给出的例子是:

class Game
{
    virtual void onKeyRelease(KeyEventArgs &e);
}

class Tutorial : public Game
{
    void onKeyRelease(KeyEventArgs &e) 
    {
        base::onKeyRelease(e);
        /* Above calls Game::onKeyRelease(e) */
    }
}

如果有人能够阐明上述工作的原因和方式,我将非常感激。

提前致谢。

2 个答案:

答案 0 :(得分:2)

单词base不是关键字,因此在class Tutorial示例中,行base::onKeyRelease(e);将无法编译。现在,如果你在某个地方看到它并且它确实编译了,你必须知道必须在某处用typedefusing语句来定义它。

使用这样的typedef的目的是添加另一个抽象级别,以帮助人们安全地更改代码。考虑到Tutorial示例,您也可以写Game::onKeyRelease(e);让我们考虑以下示例:

class Game
{
    virtual void onKeyRelease(KeyEventArgs &e);
}
class AwsomeGame : public Game
{
    virtual void onKeyRelease(KeyEventArgs &e);
}

class Tutorial : public Game
{
    typedef Game base;

    void onKeyRelease(KeyEventArgs &e) 
    {
        base::onKeyRelease(e);
        //equivalent to Game::onKeyRelease(e);
    }
}

如果您将Tutorial基类从Game更改为AwsomeGame,而typedef也已成功更改了代码而没有任何不良副作用。

不使用typedef会强制您编写对Game的显式调用,并且当基类更改时,您必须在已使用它的所有位置更改它。现在,如果您考虑上面的示例并将Game更改为AwsomeGame而不更改typedef代码有效,但您可能会在以后遇到逻辑错误:

class Tutorial : public AwsomeGame //,public Game
{

    void onKeyRelease(KeyEventArgs &e) 
    {
        Game::onKeyRelease(e);
        //code is valid, but you probably want AwsomeGame::onKeyRelease(e); 
    }
}

答案 1 :(得分:1)

这里没有什么魔力。其他一些语言将提供base或类似的关键字来访问基类。

显然,这里的程序员喜欢这样,并通过提供他们自己的base来模拟这一点。他们很可能已经写了

class Tutorial : public Game
{
    void onKeyRelease(KeyEventArgs &e) 
    {
        Game::onKeyRelease(e);
       /* Above calls Game::onKeyRelease(e) */
    }
}

并避免混淆(并对代码的作用发表评论)。