【发布时间】:2025-12-03 17:45:02
【问题描述】:
我在 C++ 中使用虚函数时遇到了一些麻烦,我可能在构造函数中误用了它们。问题是当将组件库(由我编写)链接到我的最终可执行文件时,即使我已经为它编写了一个实现并链接了它,虚函数也会被标记为未定义。
我有以下课程:
template<class BufferType, class ConnectionType, class HandlerType>
class UdpConnection
{
public:
UdpConnection(size_t dispatchCount) : service(),
listener(service),
pool(dispatchCount), sysMsgHandlers(),
bufferPool(), buffers()
{
assert(dispatchCount > 0);
initBuffers(dispatchCount);
initSysHandlers();
}
protected:
virtual void initSysHandlers() = 0;
}
在我的子类中:
class UdpClient : public UdpConnection<SyncBufferHandler, UdpClient, ClientNetworkHandler>
{
protected:
void initSysHandlers();
}
以及子类源文件:
void UdpClient::initSysHandlers()
{
}
如您所见,我在构造函数中调用了一个虚函数。据我所知,这应该没问题,因为我知道我的子类构造函数不会被调用,所以我不能使用任何实例变量,但我只是将一些子类特定项添加到标准::地图。
Linking CXX static library libnetwork.a
[ 75%] Built target network
Scanning dependencies of target testclient
[ 87%] Building CXX object CMakeFiles/testclient.dir/src/test/testclient.cpp.o
Linking CXX executable testclient
src/network/libnetwork.a(udpclient.cpp.o): In function `voip::network::UdpConnection<voip::network::client::SyncBufferHandler, voip::network::client::UdpClient, voip::network::client::ClientNetworkHandler>::UdpConnection(unsigned long)':
udpclient.cpp:(.text._ZN4voip7network13UdpConnectionINS0_6client17SyncBufferHandlerENS2_9UdpClientENS2_20ClientNetworkHandlerEEC2Em[voip::network::UdpConnection<voip::network::client::SyncBufferHandler, voip::network::client::UdpClient, voip::network::client::ClientNetworkHandler>::UdpConnection(unsigned long)]+0x10d): undefined reference to `voip::network::UdpConnection<voip::network::client::SyncBufferHandler, voip::network::client::UdpClient, voip::network::client::ClientNetworkHandler>::initSysHandlers()'
collect2: ld returned 1 exit status
我在这里做错了什么?请询问您是否需要更多信息,希望尽可能简短!
【问题讨论】:
标签: c++ inheritance undefined virtual-functions