C++动态库dll的类成员函数为什么要声明为virtual?exe编译时才不会报错

hanyj_3000 2011-12-06 02:13:39

//1、动态库dll里面定义一个TcpClass类的成员函数open
class TcpClass
{
public:
TcpClass();
bool Open(int Port,CString protocol);
};
bool TcpClass::Open(int Port,CString protocol)
{
//函数定义体
}

//2、exe应用程序端
main()
{
TcpClass *lpTcp = new TcpClass();
lpTcp->Open("7086","proco1.0");//如果不把TcpClass的open不声明为virtual函数,编译不过,会报错,为什么???
//为什么要得把open声明为virtual才编译得过去呢,不懂其中缘由。特地上来问问
}
...全文
174 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanyj_3000 2011-12-12
  • 打赏
  • 举报
回复
结贴前再次感谢sinservice,在你的指点下,我总算自己去弄清楚虚表的知识了。有高人指点,胜过自己多少功夫去摸索。
「已注销」 2011-12-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hanyj_3000 的回复:]

哦,非常感谢,大概知道点意思了,不过对通过那个叫“虚表”的来找到函数入口地址这点不太理解,可能我对“虚表”没概念
[/Quote]

看看虚函数相关知识,虚函数的实现是通过虚表(虚指针表)。
hanyj_3000 2011-12-06
  • 打赏
  • 举报
回复
哦,非常感谢,大概知道点意思了,不过对通过那个叫“虚表”的来找到函数入口地址这点不太理解,可能我对“虚表”没概念
「已注销」 2011-12-06
  • 打赏
  • 举报
回复
虚标 改为 虚表
「已注销」 2011-12-06
  • 打赏
  • 举报
回复
呵呵,这是因为,你的类TcpClass,并没有导出。

对于类的导出的实质是“成员函数的导出”,就是说,“导出一个类其实就是导出类的成员函数”。

因为dll里定义的成员函数没有导出,所以,linker在链接exe(随dll的导入库lib)的时候无法知道这些成员函数的地址,所以(注:不是编译器错误,而是链接器错误)不能链接成功。

而,当你把这些函数写成“虚”后,其链接不是通过导出的符号找到其地址,而是在运行时根据虚标动态找到函数入口地址,所以,可以链接成功。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧