gpt4 book ai didi

C++ - 在没有 RTTI/dynamic_cast 的情况下向下转换菱形继承对象

转载 作者:IT老高 更新时间:2023-10-28 22:37:21 25 4
gpt4 key购买 nike

我目前正致力于在非 RTTI 平台 (Android) 上集成使用大量 RTTI 内容的第三方包。基本上,我自己实现了 RTTI,但遇到了一个问题。

问题是很多类都有菱形继承问题,因为所有类都派生自同一个基类(对象)。所以,如果我想从基类向下转换为派生类,我必须使用 dynamic_cast - 但 RTTI 不可用!没有dynamic_cast的虚拟继承时,如何将对象从父对象转换为子对象?

看起来是这样的:

class A 
{
public:
virtual char* func() { return "A"; };
};
class B : public virtual A
{
public:
//virtual char* func() { return "B"; };
};
class C : public virtual A
{
public:
//virtual char* func() { return "C"; };
};

class D : public B, public C
{
public:
//virtual char* func() { return "D"; };
};

D d;
A* pa = static_cast<A*>(&d);
D* pd = static_cast<D*>(pa); // can't do that! dynamic_cast does work though...

这些是我的错误:

error C2635: cannot convert a 'A*' to a 'D*'; conversion from a virtual base class is implied

error C2440: 'initializing' : cannot convert from 'test_convert::A *' to 'test_convert::D *' Cast from base to derived requires dynamic_cast or static_cast

有什么想法吗?

最佳答案

您只能使用 dynamic_cast 进行此转换;没有其他 Actor 会这样做。

如果你不能设计你的接口(interface),这样你就不需要执行这种类型的转换,那么你唯一能做的就是让转换功能成为你的类层次结构的一部分。

例如(非常骇人听闻)

class D;

class A
{
public:
virtual D* GetDPtr() { return 0; }
};

class B : public virtual A
{
};

class C : public virtual A
{
};

class D : public B, public C
{
public:
virtual D* GetDPtr() { return this; }
};

关于C++ - 在没有 RTTI/dynamic_cast 的情况下向下转换菱形继承对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3347879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com