C ++:在没有对象实例的情况下调用非静态成员函数

时间:2019-03-15 01:05:54

标签: c++ open-source

我正在查看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不能回答我的问题,因为在他的情况下,实际上有一个实例是通过方法调用的(这是另一种语言)。

1 个答案:

答案 0 :(得分:1)

因为PopupMenu源自Control,所以PopupMenu的每个实例也是Control的实例。

PopupMenu的成员函数调用get_size()时,它会自行调用Control的get_size()函数。

或者换句话说,PopupMenu具有get_size()函数,因为它是从Control派生的。

在您的娱乐活动中,PopupMenu并非源自Control,因此这并不适用。