【发布时间】:2009-06-24 14:17:06
【问题描述】:
我有这样的公共接口层次结构:
struct ISwitchable {
/* Obtain pointer to another implemented interface of the same instance. */
virtual int switch(unsigned int interfaceId, void** pInstance) = 0;
};
struct IFoo : public ISwitchable { /* Methods */ };
struct IBar : public ISwitchable { /* Methods */ };
struct IFooBar : public IFoo, public IBar { /* Methods */ };
实现 IFooBar 的类与工厂函数一起放入 dll 中。客户端代码加载 dll,使用工厂函数创建类实例并根据接口使用它(它们作为头文件提供)。
方案适用于 MSVC 制作的 dll 和 Borland C++ Builder 6 制作的客户端代码。
我将虚拟继承引入层次结构:
struct IFoo : public virtual ISwitchable { /* Methods */ };
struct IBar : public virtual ISwitchable { /* Methods */ };
当在相同的情况下(MSVC 的 dll,Builder 的客户端)客户端代码请求类的实例时,他用凌乱的 vtable 得到它。
除了回滚到普通继承,还有什么解决办法吗?
【问题讨论】:
-
不确定为什么这是-1ed,似乎是一个合理的问题。
-
vtable 到底是怎么搞的?
-
我不知道,但我希望 MSVC 和 Borland C++ Builder 在 vtable 和对象结构等内部事物的实现方面有所不同。我什至会说,非虚拟版本正在运行只是运气!由于 C++ 标准没有定义确切的实现,而只定义了 C++ 如何为程序员工作,因此由 C++ 编译器生产者来设计内部对象结构。
-
您通常可以指望 Windows 上的单继承 VTable 被实现为 COM 规范,这意味着它们可以相互协作。没有什么可以保证的,但是任何想要创建 COM 兼容对象的编译器都会这样做。
标签: c++ visual-c++ c++builder virtual-inheritance