【发布时间】:2015-07-23 02:07:29
【问题描述】:
我最近在 GitHub 上查看 Notepad++ 源代码,came across 一个方法调用是这样的:
Window::init(hInst, parent);
我搜索了它所引用的函数,发现了一个Window 类- 但init 函数被标记为virtual,所以很明显它是非静态的。以为我犯了一个错误,我检查了整个标头以确保没有init 的静态重载,并确保没有Window.cpp 文件。没有。
在查看源代码 15 分钟后,我放弃了并在本地 git cloned 存储库,以便我可以在 Visual Studio 中打开它。我做的第一件事是构建,只是为了确保这不是代表项目开发人员的意外合并——构建成功。
我采取的后续步骤:
我打开了调用
Window::init的文件并在Window上单击了Go To Declaration。它带我去Window课程。我在
init函数上单击了Go To Declaration。它指向了虚拟方法的签名。我将
Window.h文件复制并粘贴到一个全新的标题中,并将Window的所有引用替换为Foo。当我输入Foo::init时,编译器会抱怨“非静态成员引用必须与特定对象相关”。
TL;DR: 不知何故,Notepad++ 源代码静态调用了一个非静态方法,然后构建。不适用于任何其他类。证明here和here。
我花了 2 个小时盯着这个,但我仍然不明白这怎么可能。我错过了什么吗?
【问题讨论】:
-
这就是你在重写虚函数中调用基函数的方式。