我正在查看Godot游戏引擎的源代码,并遇到了以下内容(为简单起见,省略了一些内容):
// popup_menu.cpp
int PopupMenu::_get_mouse_over(double x) const
{
if (x >= get_size().width)
return -1;
// ...
}
// control.cpp
Size2 Control::get_size() const
{
return data.size_cache;
}
为什么在不首先实例化类型为get_size()
的对象然后调用其成员函数的情况下调用方法Control
是合法的吗?我试图在我自己的文件中重新创建此行为,但它不会像我通常期望的那样编译:
class Control
{
public:
double get_size() const;
};
double Control::get_size() const
{
return 5.0;
}
class PopupMenu
{
public:
int _get_mouse_over(double d) const;
};
int PopupMenu::_get_mouse_over(double d) const
{
return d > get_size(); // compile error, as expected
}
什么可能导致此行为?如果您有兴趣,可以在以下位置找到每种方法的实际源代码:
第110行: https://github.com/godotengine/godot/blob/master/scene/gui/popup_menu.cpp
第1770行: https://github.com/godotengine/godot/blob/master/scene/gui/control.cpp
我搜索了这个问题,发现C#: calling non static member function without creating object不能回答我的问题,因为在他的情况下,实际上有一个实例是通过方法调用的(这是另一种语言)。
答案 0 :(得分:1)
因为PopupMenu
源自Control
,所以PopupMenu
的每个实例也是Control
的实例。
当PopupMenu
的成员函数调用get_size()
时,它会自行调用Control的get_size()
函数。
或者换句话说,PopupMenu
具有get_size()
函数,因为它是从Control
派生的。
在您的娱乐活动中,PopupMenu
并非源自Control
,因此这并不适用。