跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • c++动态链接库的问题
未分類
14 2 月 2020

c++动态链接库的问题

c++动态链接库的问题

資深大佬 : a1lenyang 18

//头文件 TaxCaculator.h class _declspec(dllexport) TaxCalculator { private:     double income;     double taxRate; public:   int a;   int b;     TaxCalculator(double income, double taxRate);     ~TaxCalculator();     virtual double calculate(); }; extern "C" _declspec(dllexport) TaxCalculator* CreateObjet (double income, double taxRate); 
//实现文件 TaxCaculator.cpp #include "TaxCaculator.hpp" TaxCalculator::TaxCalculator(double income, double taxRate){     this -> income = income;     this -> taxRate = taxRate;    a = 2;    b = 5; } TaxCalculator::~TaxCalculator(){      } double TaxCalculator::calculate(){     return (income * taxRate); } 
  • 以上程序生成 dll,然后在同一个编译器中建立一个新的客户文件调用
#include "TaxCalculator.h" #include <iostream> int main() {   TaxCaculator* caclulator = CreateObject(1000, 0.3);     int a = calculator -> a;     int b = calculator -> b;   return 0; }  
  • 在 dll 文件中,改变 a 和 b 定义的位置,然后重新编译,**客户文件重新调用新的 dll 文件,为什么两次的结果是颠倒的?**这里不是很理解。
  • 同理,在 dll 文件中定义两个虚函数
    virtual int fa();       virtual int fb();   

分别实现之。 编译服务器端和客户端。得到版本 1.

改变定义顺序:

virtual int fb();  virtual int fa(); 

编译服务器端和客户端。得到版本 2. 打乱版本的搭配顺序,调用将出现错乱。这又是为什么?

大佬有話說 (6)

  • 資深大佬 : codehz

    因为虚函数是按声明顺序保存在虚表里的,所以实际上你写 x.fa()的时候编译器就会生成对虚表第一个函数的调用,所以你改变声明顺序就会导致调用错误函数

  • 資深大佬 : catcn

    不要导出 c++

  • 資深大佬 : rigortek

    加 log 调试一下看为什么错乱

  • 主 資深大佬 : a1lenyang

    @codehz 好的,虚函数明白了,原来是我忘记了头文件是没有改变的,只是改变了 dll 的版本。
    虚函数的顺序有虚表保存,请问变量 a, b 也是以某种顺序存储的吗?

  • 資深大佬 : codehz

    @a1lenyang 变量顺序是不变的,但是要注意虚表会在开头额外占用一个指针,多重继承的时候则有可能会更多,因此最好每次变更都同时更新头文件并重新编译其他依赖的库

  • 主 資深大佬 : a1lenyang

    @codehz 明白了,谢谢

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具