小编Cap*_*lli的帖子

动态铸造需要目标类型吗?

看下面的表达式:

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)

c++ dynamic-cast

2
推荐指数
1
解决办法
94
查看次数

共享库的Dynamic_cast麻烦

我对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)
  1. 主应用程序加载共享库并请求一个新对象
  2. 共享库创建一个新C对象,但dynamic_cast<A*>(pointerToCclass)由于主应用程序不知道该对象而返回a C
  3. 当主应用程序尝试B 从返回的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)

c++ inheritance gcc shared-libraries

0
推荐指数
1
解决办法
2164
查看次数

标签 统计

c++ ×2

dynamic-cast ×1

gcc ×1

inheritance ×1

shared-libraries ×1