C++ 中的接口与实现。这是什么意思?

Interface vs Implementation in C++. What does this mean?

我正在学习继承的概念,尤其是关于访问说明符的概念,在这里我对 protected 访问说明符感到困惑。受保护的成员可以被基 class 成员函数和派生 class 成员函数访问。如果我们将 protected 声明为访问说明符,则有可能弄乱基数 class 的 implementation。在 private 下声明数据成员总是比受保护更好,因为只有 interface 被暴露而不是 implementation 部分。我们只在 class 的私有部分声明变量,它如何变成 implementation?实施将在 member functions 中完成,对吗?这些术语令人困惑,谁能为我澄清和解释这些术语?

接口和实现不是特定于 C++ 的想法,听起来您对什么是接口和什么是实现感到困惑通常,所以希望通过解释它们是什么用 C++ 会更容易理解。

This SO question(虽然不完全是你问的)对什么是接口有一个很好的定义:

An interface is a contract: the guy writing the interface says, "hey, I accept things looking that way", and the guy using the interface says "Ok, the class I write looks that way".

An interface is an empty shell, there are only the signatures of the methods, which implies that the methods do not have a body. The interface can't do anything. It's just a pattern.

在他的例子中,接口是(翻译成C++):

class MotorVehicle
{
public:
    virtual void run() const = 0;
    virtual int getFuel() const = 0;
}

然后实现是:

class Car : public MotorVehicle
{
    int fuel;

public:
    void run() const override
    {
        printf("Wrroooooooom\n");
    }


    int getFuel() const override
    {
        return this->fuel;
    }
}

实现想法背后的实际内容,接口[=52​​]的实际定义=] 会做我们期望的事情。另一个例子:就算法而言,我们谈论深度优先搜索 (DFS) 并且它具有明确定义的行为,但是我们如何 code,或 implement,该算法可能会有所不同。例如,我们可以使用递归或堆栈数据结构。

现在关于访问说明符:使用protected访问也不错。我们将继承视为一种 "is-a" 关系。当我们说 Cat 继承自 Animal 时,我们也说 Cat 是一个 Animal。所以Cat使用Animal的一些实例变量是完全正常的,因为它应该无论如何都属于Cat

您担心子类所做的某些事情会通过更改实例变量弄乱超类所做的事情。您当然可以通过从子类中输入无意义的数据来做到这一点,但通常您不会这样做。您使用实例变量作为超类打算使用它们(否则您确实会搞砸功能),应该记录下来。如果您仍然认为某人真的不应该使用您的实例变量,那么这就是 private 说明符的用途。

最后一件事:覆盖超类方法还应该防止滥用超类变量。通过访问和写入 protected 变量,您可能会将超类方法的行为更改为不需要的行为,但随后应覆盖这些方法以执行您的子类打算执行的新操作。