链接时未定义C虚函数 – 为什么?
我在使用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() { } 如您所见,我在构造函数中调用虚函数.据我所知,这应该没问题,因为我知道我的子类构造函数不会被调用,所以我不能使用任何实例变量,但我只是添加一些子类特定的项目到一个的std ::地图. 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::ClientNetworkHandler>::UdpConnection(unsigned long)]+0x10d): undefined reference to `voip::network::UdpConnection<voip::network::client::SyncBufferHandler,voip::network::client::ClientNetworkHandler>::initSysHandlers()' collect2: ld returned 1 exit status 我在这做错了什么?请询问您是否需要更多信息,希望尽可能缩短! 解决方法
您正在从基类构造函数中调用虚函数.在构建和销毁期间发送虚拟功能有特殊规则:
实际上,当基类UdpConnection的构造函数正在执行时,对象的动态类型是UdpConnection,而不是UdpClient,因此选择的虚函数的最终覆盖是UdpConnection的最终覆盖,而不是最派生的类UdpClient. 这意味着当您在UdpConnection构造函数中调用initSysHandlers()时,UdpConnection :: initSysHandlers()会被调用,而不是最派生类中的覆盖.因为您没有提供UdpConnection :: initSysHandlers()的定义,所以会出现链接器错误. 专家建议你应该“Never Call Virtual Functions during Construction or Destruction”. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |