是否可以在基类中调用派生类的函数?

Can I call a derived class's function in base class?

本文关键字:派生 函数 调用 基类 是否      更新时间:2023-10-16

我在派生类中有一个函数d(),它将在基类函数b()中调用。我试图通过在基类中创建一个同名的虚拟函数来实现这一点(以满足编译器的要求并强制执行后期绑定)。我将始终使用派生类的对象来调用b()。但问题是编译进行得很好,但链接器返回了一个错误:

undefined symbol <baseclass_name>::d in module main.cpp   

奇怪的是,d()甚至没有在main.cpp中调用。它是在另一个文件中定义和调用的。

我被困在这里了。有人能给出任何可能的解释或提出更好的方法吗?

(我需要从基类调用d(),否则会使我的代码变得更加庞大…)

您需要实现基类版本,或者在基类中声明它为纯虚拟(或两者兼有),这取决于基类实现它是否有意义。所有非纯虚拟函数都必须实现,这可能就是您出现此错误的原因。

模板方法模式可以帮助您在基类上声明函数纯虚拟,并在派生类上实现它。并在基类上正常使用该函数。

我认为您的问题可能不是C++,而是链接。如果将d()放在另一个cpp文件中,则必须编译并将这些文件链接在一起。例如:

g++ main.cpp a.cpp b.cpp -o test

这将编译三个.cpp文件,并将它们链接到名为"test"的可执行文件中。

如果你使用的是IDE,你可能需要创建一个项目,并将所有必需的cpp文件添加到其中。当你构建时,项目中的所有文件都将用于构建你的可执行文件。