c++动态链接库的问题

2020-04-15 12:03:06 +08:00
 a1lenyang
//头文件 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);
}
#include "TaxCalculator.h"
#include <iostream>
int main() {
  TaxCaculator* caclulator = CreateObject(1000, 0.3);
    int a = calculator -> a;
    int b = calculator -> b;
  return 0;
}

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

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

改变定义顺序:

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

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

1592 次点击
所在节点    C++
6 条回复
codehz
2020-04-15 12:14:31 +08:00
因为虚函数是按声明顺序保存在虚表里的,所以实际上你写 x.fa()的时候编译器就会生成对虚表第一个函数的调用,所以你改变声明顺序就会导致调用错误函数
catcn
2020-04-15 12:17:46 +08:00
不要导出 c++
rigortek
2020-04-15 12:27:33 +08:00
加 log 调试一下看为什么错乱
a1lenyang
2020-04-15 12:37:39 +08:00
@codehz 好的,虚函数明白了,原来是我忘记了头文件是没有改变的,只是改变了 dll 的版本。
虚函数的顺序有虚表保存,请问变量 a, b 也是以某种顺序存储的吗?
codehz
2020-04-15 12:43:32 +08:00
@a1lenyang 变量顺序是不变的,但是要注意虚表会在开头额外占用一个指针,多重继承的时候则有可能会更多,因此最好每次变更都同时更新头文件并重新编译其他依赖的库
a1lenyang
2020-04-15 12:45:31 +08:00
@codehz 明白了,谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/662597

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX