如何在运行时搜索C++中的继承树
How do I search the inheritance tree in C++ at runtime?
我有一个模板,它为类添加了特定功能:
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
转换为SomeOtherClass
? dynamic_cast
不起作用。问题是会有很多派生类,我不知道在树中的哪个位置继承了能力。我需要在树中搜索从Able
继承发生的位置。
有什么想法吗?
编辑:
我试图
dynamic_cast<SomeOtherClass*>(dynamic_cast<Derived2WithAbility*>(basePointer))
但我得到:
error: ‘SomeOtherClass’ is an inaccessible base of ‘Derived2WithAbility’
知道为什么吗?
class Able : public ReceiverOfAbility, SomeOtherClass
SomeOtherClass
是 Able<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 继承。公开继承,它会起作用。
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 如何在QT Creator上将QWidget声明为继承类的对象