如何在运行时搜索C++中的继承树

How do I search the inheritance tree in C++ at runtime?

本文关键字:继承 C++ 搜索 运行时      更新时间:2023-10-16

我有一个模板,它为类添加了特定功能:

template <Class ReceiverOfAbility>
class Able : public ReceiverOfAbility, SomeOtherClass
{
...
}

然后我有一个标准的树状继承:

class Base
{};
class Derived1 : public Base
{};
class Derived2 : public Derived1
{};
...

但是在树的某个地方有一个"倒退的分支"

class Derived2WithAbility : public Able<Derived2>
{};

假设我有:

 Base* basePointer = new DerivedWithAbility;

如何在运行时将basePointer转换为SomeOtherClassdynamic_cast不起作用。问题是会有很多派生类,我不知道在树中的哪个位置继承了能力。我需要在树中搜索从Able继承发生的位置。

有什么想法吗?

编辑:

我试图

dynamic_cast<SomeOtherClass*>(dynamic_cast<Derived2WithAbility*>(basePointer))

但我得到:

error: ‘SomeOtherClass’ is an inaccessible base of ‘Derived2WithAbility’

知道为什么吗?

class Able : public ReceiverOfAbility, SomeOtherClass

SomeOtherClassAble<whatever>私有基类。为了使dynamic_cast起作用(即能够成功地投射到SomeOtherClass),它必须是一个公共基础。

我认为扫描继承树不是一个好主意。请参阅这篇关于通过 vtables 的文章,它甚至无法通过您的代码访问

http://kaisar-haque.blogspot.com/2008/07/c-accessing-virtual-table.html

我可以看到这在调试中很有用,但你不能指望它在运行时。

我认为您遇到的是多重继承很复杂的原因,您拥有从多个基类继承的类,因此在这些情况下找到一个公共基类根来指向您的派生对象可能会变得毛茸茸的。 我没有真正的答案给你,除了可能重新考虑你的遗产继承权。你能用组合代替继承,坚持单一的继承树吗? 这将使事情变得简单得多。

如何在运行时将 basePointer 强制转换为 SomeOtherClass? dynamic_cast不起作用。

你必须使用dynamic_cast。如果它"不起作用",那么你就不能投射。仅当基类至少有一个虚函数时,dynamic_cast才会起作用(虚拟析构函数应该可以解决问题)。

我需要在树中搜索从 Able 继承发生的位置。

据我所知,RTTI不提供类的"继承"信息。但是,您可能能够在调试器中看到继承信息。当然,此信息的可用性取决于调试器。

--编辑--

你使用私有继承从 SomeOtherClass 继承。公开继承,它会起作用。