如何调用虚拟虚空函数C++

How to call a virtual void function C++?

本文关键字:函数 C++ 虚拟 何调用 调用      更新时间:2023-10-16

我在网上发现了一个练习。这个练习包括我以前从未见过的"虚拟空白"是如何工作的。因此,该练习包含 1 个名为 plans.h 的头文件

namespace plans {
class HumanActions {
public:
  virtual void goTo() { }
  virtual void haveANiceColdBeer() { }
};
void applyPlan(HumanActions &actions);
}

和一个 CPP 文件

#include "Plans.h"
using plans::HumanActions;
using plans::applyPlan;
void
plans::applyPlan(HumanActions &actions) {
  actions.goTo();
  actions.haveANiceColdBeer();
}

我试图通过另一个运行类似的主文件来运行该功能

#include "Plans.h"
using plans::HumanActions;
using plans::applyPlan;
int main() {
    HumanActions actions;
    applyPlan(actions);
}
不幸的是,它

没有运行,它说我对"计划::应用计划(计划::行动&)"有未定义的引用,所以我的问题是你如何传递那些给定参数的函数?

您在头文件中声明了"void applyPlan(HumanActions &actions)",但您尚未在任何地方定义(实现)它,这就是您拥有未定义符号的原因。

如果在main()中,你调用了applyZombiePlan()而不是applyPlan(),你应该没问题。

"

未定义的引用"是一个链接器错误,表示找不到函数的实现。 换句话说,这通常意味着您声明了函数并调用了函数,但忘记实际编写函数。

您的错误消息指的是plans::applyPlan(plans::Actions&),但我看到的最接近的声明是 void applyPlan(HumanActions &actions); ,它具有不同的参数类型。 假设这不仅仅是您帖子中不同版本的代码之间的混淆,您可能不小心声明了两个不同的applyPlan函数,但只实现了其中一个。

如果您的程序包含多个.cpp文件,另一个可能的原因是您不小心尝试编译和链接单个文件,就好像它是一个完整的程序,而不是将所有模块链接在一起。 这将使链接器看不到其他.cpp文件中定义的任何内容。 如果您是初学者,最好的选择是使用单个命令行一次编译所有源文件,例如 g++ *.cpp -o myprog .

调用

虚函数与调用常规函数没有什么不同,顺便说一句,applyPlan无论如何都不是虚函数。

我认为你可以使用 extern 关键字。 每当你实际定义全局函数时,你可以说void XYZ(){},在其他任何地方你可以说extern void XYZ()。