看下面的表达式:
Target * p = dynamic_cast<Target*>(pFarAncestor);
Run Code Online (Sandbox Code Playgroud)
是否存在动态转换类型可能与左值(本例中为p)类型不同的情况?换句话说,有一个原因,一直是显式目标变量的类型?
我想知道为什么编译器不接受如下的签约形式:
Target * p = dynamic_cast<>(pFarAncestor);
Run Code Online (Sandbox Code Playgroud)
甚至
Target * p = dynamic_cast(pFarAncestor); // ok this seems a function call indeed
Run Code Online (Sandbox Code Playgroud) 我对dynamic_cast共享库创建的对象有些麻烦:
该架构类似于:
class A;
class B : virtual public A; // one of the several interfaces
class C : public B; // defined only in the shared library
Run Code Online (Sandbox Code Playgroud)
C对象,但dynamic_cast<A*>(pointerToCclass)由于主应用程序不知道该对象而返回a
CB
从返回的A指针向下转换到它时,它将失败。我怀疑在主代码和共享代码中创建的vtables有所不同可能是原因。无论如何,起初我并不知道这个问题,因为主应用程序调用了method void * A::getInterface( int ifEnum ),所以向下转换由共享库代码成功执行,并作为空指针返回。然后,主应用程序执行a,reinterpret_cast以将void指针绑定到所需的接口。
到现在为止,所有工作都有效,当时多继承架构(C实现多个接口)似乎不稳定并导致分段错误。
我的嫌疑人是真的吗?有没有更好的方法或一种众所周知的方法来实现类似的体系结构?
谢谢
我将基本应用程序的一些简化代码附加到基本角色上。首先是通用定义:
class A
{
public:
typedef A* (*getAobject_fn)(void);
static A * Load( char * filename ) {
void * objhlib = dlopen( filename, …Run Code Online (Sandbox Code Playgroud)