什么是“非虚拟界面”和“抽象界面”之间的区别?

时间:2013-08-30 23:21:25

标签: c++ design-patterns architecture interface

我正在用C ++实现设计模式,我希望我的类通过组合来利用接口,这使我学习了实现接口的不同方法。我想澄清这个术语的定义。

1 个答案:

答案 0 :(得分:6)

非虚拟接口是一个非虚拟的公共成员函数,但通常希望以的方式实现一个可覆盖的虚函数:

class Interface
{
public:
    int compute()
    {
        return compute_impl();
    }
private:
    virtual int compute_impl() = 0;
protected:
    virtual ~Interface() { }
};

这里的巧妙之处在于实现实际上是private,因为您仍然可以覆盖私有方法 - 您无法从外部调用它们。

相比之下,抽象接口本身就是虚拟的,纯粹在接口类中是这样的:

class Interface
{
public:
    virtual int compute() = 0;
protected:
    virtual ~Interface() { }
};

虽然这两种方法看起来非常相似,但非虚拟接口习惯用法的优点是接口不会受到虚拟成员函数的实现细节的阻碍。换句话说,接口的不同实现通过覆盖虚函数来满足其契约的事实是实现的细节,其不是接口的公共方面的一部分。特别是,作者可以自由地改变函数的实现方式,而不必担心用户已经开发了自己的继承并覆盖了层次结构。