c – “非虚拟接口”和“抽象接口”之间的区别是什么?

我在C中实现设计模式,我希望我的类通过组合来利用接口,这使我学习了实现接口的不同方法.我想澄清一下这个术语的定义.
最佳答案
非虚拟接口是一个非虚拟的公共成员函数,但通常希望根据可覆盖的虚函数来实现:

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

这里的好处是实现实际上是私有的,因为你仍然可以覆盖私有方法 – 你不能从外部调用它们.

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

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

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

转载注明原文:c – “非虚拟接口”和“抽象接口”之间的区别是什么? - 代码日志