我只是想了解我正在阅读的一些教程代码。我正在尝试学习一些 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
更改为 AwsomeGame
和 typedef
,您也已成功更改代码,没有任何不良副作用。
不使用 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/