实现接口独立性:从编译器到供应商的全面解决方案
在软件开发中,实现编译器和供应商的独立性是一个重要的目标。这不仅能提高代码的可移植性,还能让我们在不同的环境中灵活选择合适的实现。下面将详细介绍如何通过抽象基类、动态组件选择和接口功能扩展等方法来实现这些目标。
1. 抽象基类作为接口
在实现编译器独立性时,非标准的名称修饰方案是一个主要问题。不过,如果客户端调用类的虚方法,生成的机器语言代码不会通过符号名称引用该方法,而是使用虚表(vtbl)机制来调用。因此,只要客户端只调用虚方法,名称修饰就不再是问题。
然而,使用虚方法机制会带来三个新问题:
- 数据成员问题 :如果接口类包含数据成员,虚指针(vptr)在内存布局中的位置由供应商决定,不同供应商可能有不同的放置方式。解决办法是在接口定义中不声明任何数据成员,这也符合向客户端隐藏实现细节的原则。
- 多重继承问题 :接口类的多重继承会导致类的内存布局中包含多个 vptr,而且 vptr 的顺序没有统一标准。可以通过限制派生为一个基类来解决这个问题。
- 虚表条目顺序问题 :客户端编译器假设 vtbl 中的第一个条目是接口类中声明的第一个虚函数的地址,第二个条目是第二个虚函数的地址,以此类推。但对于重载的虚函数,这个假设在所有编译器中并不成立。因此,接口类中不应允许重载函数声明。
为了确保所有编译器为接口的客户端方法调用生成等效的机器语言代码,接口类定义应满足以下条件:
- 只包含纯虚方法
- 不包含任何重载的虚方法
- 不包含任何成员变量
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



