c++ - 了解空继承类的未使用 typedef

标签 c++ inheritance typedef

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

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

这是由其他事件类继承的。因此,例如,他们有一个按键事件参数类,如下所示:

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

    // Rest of the class
}

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

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

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

如果有人能阐明上述为什么/如何工作,我将不胜感激。

提前致谢。

最佳答案

单词 base 不是关键字,所以在 class Tutorial 示例中,行 base::onKeyRelease(e); 不会编译。现在,如果你在某处看到它并且它确实编译了,你必须知道它必须由 typedef 定义。或 using在某处声明。

使用这样的 typedef 的目的是添加另一个抽象级别来帮助人们安全地更改代码。考虑到教程示例,您也可以编写 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 更改为 AwsomeGametypedef,您也已成功更改代码,没有任何不良副作用。

不使用 typedef 会强制您编写对 Game 的显式调用,并且当基类发生变化时,您将不得不在所有地方进行更改用过它。现在,如果您考虑上面的示例,并且在不更改 typedef 的情况下将 Game 更改为 AwsomeGame 代码是有效的,但您可能会遇到稍后出现逻辑错误:

class Tutorial : public AwsomeGame //,public Game
{

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

关于c++ - 了解空继承类的未使用 typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32068683/

相关文章:

C++:将字符串作为常量引用是否经常被认为是一种好习惯?

c++ - VC++ 6 项目迁移到 VC++ 2008 时出现模板类编译错误

C++ 将派生类的 const 值传递给基本意外行为的构造函数

java - Java继承中的私有(private)成员

c++ - 尽管使用指令,gcc 11.3.0 仍找不到运算符

c++ - 电影中的代码不清楚。这合法吗?

c# - 接口(interface)接口(interface) <T> : T

c++ - 你可以将任何指针类型或基类传递到函数 typedef 中吗

c - 未定义类型的无效使用 ‘struct book_implementation’

c - 是否有 typedef 函数指针的替代语法?