Jac*_*ack 4 c++ dynamic-cast multiple-inheritance rtti c++14
我有如下结构:
struct managed_object {
virtual ~managed_object() { }
};
class trait1 {
public:
virtual void myMethod() const = 0;
};
class trait2 {
public:
virtual void myOtherMethod(int x) const = 0;
};
class MyType final : public managed_object, public trait1 {
...
};
class MyType2 final : public managed_object, public trait1, public trait2 {
...
};
class wrapper {
private:
managed_object* ptr;
public:
template<typename T> T* object() const {
return dynamic_cast<T*>(data.ptr);
}
};
Run Code Online (Sandbox Code Playgroud)
所以基本上我有一个managed_object基类,多个类型从中继承。这些子类型中的每一个都可以从特征的任意组合中继承,final因此我确信它们不会有更深层次的继承。
该代码的工作归功于 RTTI,它承担了将所有东西粘合在一起的负担,但要付出代价,否则
wrapper w = ...
trait* asTrait1 = w.object<trait1>;
Run Code Online (Sandbox Code Playgroud)
不会起作用,因为managed_object和trait1类型之间没有直接关系。
在我的完整代码中,我已经确定一切dynamic_cast都不会失败,因为我有额外的数据(示例中未显示),它为我提供了一种代码其他部分所需的 RTTI。
鉴于此,假设我已经知道一个类是从特定的继承而来的,是否有一种通用模式可以在不使用和 RTTI 的情况下解决侧面向下转换问题?我试图找到一个聪明的解决方案,因为它是代码的一个严重瓶颈。dynamic_castMyTypetrait
你不能使用dynamic_cast没有RTTI。除了少数极端情况。
您可以使用static_cast或reinterpret_cast(请不要),虽然,但随后它在你,如果你弄错了-那么你可以测试不再nullptr如果中投得手看