c++-虚函数

通过动态库dlsym一个类,如果这个类有虚函数,外面引用的头文件和类中定义的头文件虚函数声明顺序不一样,会不会有问题? 例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DynamicLib.h 
class A 
{ 
virtual int funcA() = 0
virtual int funcB() = 0
virtual int funcC() = 0
};

class B : public

int funcA() {printf(“B::funcA”);} 
int funcB() {printf(“B::funcB”);} 
int funcC() {printf(“B::funcC”);} 
}

extern “C” 
A* getInstanceOfA() 

return new B(); 
}

Android.mk将其编译成一个动态库libDynamic.so

如果我们在使用libDyanmic.so都时候,提供了一个错误的头文件, 
DynamicLib_err.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A 
{ 
virtual int funcC() = 0
virtual int funcA() = 0
virtual int funcB() = 0
};

int main() 

void* handle = dlopen(“libDynamic.so”); 
typedef A* (*FUNC)(); 
FUNC getInstance = dlsym(handle, “getInstanceOfA”); 
A* aa = getInstance(); 
aa->funcA(); 
aa->funcB(); 
aa->funcC(); 
}

打印如下: 
B::funcB() 
B::funcC() 
B::funcA()

  虚函数在虚函数表中是按声明顺序排列的,是通过虚函数表来调用的。 那如果不是纯虚函数,是否能正确打印呢?通过验证发现,如果某个函数不是纯虚函数,而被调用到,本身无法编译通过,所以如果要通过dlsym出一个类,这个类的所有函数都应该是纯虚函数。

  • 版权声明: 本博客所有文章,未经许可,任何单位及个人不得做营利性使用!转载请标明出处!如有侵权请联系作者。
  • Copyrights © 2015-2021 翟天野

请我喝杯咖啡吧~