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

hal*_*y9k 4 c++ architecture design-patterns interface

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

Ker*_* SB 6

非虚拟接口是一个公共成员函数不是虚拟的,但通常预计将实现来讲是重写虚函数:

class Interface
{
public:
    int compute()
    {
        return compute_impl();
    }
private:
    virtual int compute_impl() = 0;
protected:
    virtual ~Interface() { }
};
Run Code Online (Sandbox Code Playgroud)

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

相比之下,抽象接口本身就是虚拟的,在接口类中完全如此:

class Interface
{
public:
    virtual int compute() = 0;
protected:
    virtual ~Interface() { }
};
Run Code Online (Sandbox Code Playgroud)

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