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

C++ C++;:在没有对象实例的情况下调用非静态成员函数,c++,open-source,C++,Open Source,我正在查看Godot游戏引擎的源代码,发现了以下内容(为了简单起见,省略了一些内容): 为什么调用方法get_size()而不先实例化Control类型的对象,然后调用其成员函数是合法的?我试图在自己的文件中重新创建此行为,但它不会像我通常预期的那样编译: class Control { public: double get_size() const; }; double Control::get_size() const { return 5.0; } class Popu

我正在查看Godot游戏引擎的源代码,发现了以下内容(为了简单起见,省略了一些内容):

为什么调用方法
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行:

第1770行:


我搜索了这个问题,发现其中一个问题没有回答我的问题,因为在他的例子中,实际上有一个实例是通过调用该方法的(这是一种不同的语言)。

因为
弹出菜单
源于
控件
PopupMenu
的每个实例也是
控件的一个实例

PopupMenu
的成员函数调用
get\u size()
时,它会在自身上调用控件的
get\u size()
函数

或者换句话说,
PopupMenu
有一个
get\u size()
函数,因为它是从
控件派生的


在您的娱乐中,
PopupMenu
不是从
控件派生的,因此这不适用。

PopupMenu是从控件派生的吗?@immibis是的,它是<代码>类弹出:公共控件
类弹出菜单:公共弹出
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
}