编辑:好的,正如我现在看到的,这改变了很多情况,所以更精确的情况是这样的:
我目前拥有的层次结构与此有些相似:
class IBase() { virtual void Foo() = 0; };
class Base() : public IBase { virtual void Foo() { } };
class IDerived() { virtual void Bar() = 0; };
template<typename TT, typename TB, typename... TI>
class Derived : public Base, public IDerived { virtual void Bar() {}};
template<typename TT, typename TB, typename... TI>
IBase* CreateDerived() { return new Derived(); }
IBase* derived = CreateDerived<some types...>();
我在尝试强制转换对象并调用函数时遇到 Visual Studio 错误:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.
通过派生对 IBase 接口的所有调用都可以正常工作,但是当我尝试将派生转换为 IDerived 时,调用任何函数时都会出现错误:
IDerived* d = (IDerived*)derived;
d->Bar(); <- boom error ;)
我猜这样的转换是非法的,但是我怎样才能转换指针,以便我可以访问 IDerived 接口方法(最好没有 dynamic_cast,如果存在的话,我更喜欢一个好的和可移植的 hack ;))?是否有可能以某种方式计算指针的偏移量,以便使用正确的 vtable 并且一切正常?
我已经编程了很长时间,但我总是避开那些对具有大量界面和模板的工程系统的幻想,现在我注定要自己制作一个。
编辑:现在你可以看到这变得棘手和困难。我不知道我得到的 Derived 的确切类型,因为它是模板化的,函数 CreateDerived 也是模板化的并返回接口。
此外,其中一项要求是不使用 dynamic_cast(项目中禁用了 RTTI)