我在运行时加载的共享库中实例化的对象上使用 dynamic_cast 时遇到了一个问题,但前提是该类包含覆盖另一个方法的方法。
我将 Xcode 4.3 与“Apple LLVM 3.1 编译器”一起使用我已经在 linux 上使用 gcc 和 clang 编译了相同的代码并且没有问题,所以我假设它是 Xcode 中的编译器错误,但有人看过这个前?
假设在名为“test3.h”的头文件中定义类
#pragma once
class c1
{
public:
virtual ~c1 ();
virtual void foo ();
};
class c2 : public c1
{
public:
void foo () override;
};
class c3 : public c1
{
public:
};
假设在名为“test3.cpp”的源文件中的静态库中的实现代码
#include "test3.h"
c1::~c1 ()
{
}
void c1::foo ()
{
}
void c2::foo ()
{
}
假设在名为 test2.cpp 的源文件中有一个简单的动态库
#include "test3.h"
extern "C"
c1 * get1 ()
{
return new c2;
}
extern "C"
c1 * get2 ()
{
return new c3;
}
假设在名为 test1.cpp 的源文件中有一个简单的可执行应用程序
#include "test3.h"
#include <dlfcn.h>
#include <iostream>
int main ()
{
auto lib (dlopen ("libtest2.dylib", RTLD_NOW | RTLD_GLOBAL));
auto a1 (dlsym (lib, "get1"));
auto a2 (dlsym (lib, "get2"));
auto f1 ((c1 * (*) ())a1);
auto f2 ((c1 * (*) ())a2);
auto o1 (f1 ());
auto o2 (f2 ());
auto d1 (dynamic_cast <c2 *> (o1));
auto d2 (dynamic_cast <c3 *> (o2));
auto result1 (d1 != 0);
auto result2 (d2 != 0);
std::cout << result1 << std::endl;
std::cout << result2 << std::endl;
}
运行测试程序时,result1 为假,而 result2 为真。我期望 result1 和 result2 都是真的。
有没有人看到这个或可以想到一个解决方法?