//头文件 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. 打乱版本的搭配顺序,调用将出现错乱。这又是为什么?
1
codehz 2020-04-15 12:14:31 +08:00 via Android
因为虚函数是按声明顺序保存在虚表里的,所以实际上你写 x.fa()的时候编译器就会生成对虚表第一个函数的调用,所以你改变声明顺序就会导致调用错误函数
|
2
catcn 2020-04-15 12:17:46 +08:00
不要导出 c++
|
3
rigortek 2020-04-15 12:27:33 +08:00 via iPhone
加 log 调试一下看为什么错乱
|
4
a1lenyang OP @codehz 好的,虚函数明白了,原来是我忘记了头文件是没有改变的,只是改变了 dll 的版本。
虚函数的顺序有虚表保存,请问变量 a, b 也是以某种顺序存储的吗? |
5
codehz 2020-04-15 12:43:32 +08:00 via Android
@a1lenyang 变量顺序是不变的,但是要注意虚表会在开头额外占用一个指针,多重继承的时候则有可能会更多,因此最好每次变更都同时更新头文件并重新编译其他依赖的库
|