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

时间:2016-08-05 11:33:12

标签: c++ inheritance interface protected

我正在学习继承的概念,特别是有关访问说明符的概念,这里我对protected访问说明符感到困惑。受保护的成员可以通过基类成员函数和派生类成员函数访问。如果我们声明protected作为访问说明符,则有可能弄乱implementation基类。最好在private下声明数据成员而不是仅受interface公开,而不是implementation部分。我们只声明类的私有部分中的变量以及它如何成为implementation?实施将在member functions权利中完成?条款令人困惑,任何人都可以澄清和解释我的条款吗?

1 个答案:

答案 0 :(得分:5)

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

This SO question(虽然不完全是你要问的)对界面的定义有一个很好的定义:

  

界面是合同:编写界面的人说,"嘿,我接受那样的事情",并且使用界面的人说"好吧,我写的课看起来就是这样#34;。

     

接口是一个空壳,只有方法的签名,这意味着这些方法没有正文。界面无法做任何事情。这只是一种模式。

在他的例子中,接口是(翻译成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;
    }
}

实现构思背后的实际内容,接口将如何实现我们所期望的实际定义。另一个例子:在算法方面,我们谈论深度优先搜索(DFS),它有一个明确定义的行为,但我们如何代码实现,该算法可以变化。例如,我们可以使用递归或堆栈数据结构。

现在关于访问说明符:使用protected访问权限并不错。我们将继承称为&#34; is-a&#34; 关系。当我们说Cat继承自Animal时,我们也会说Cat Animal。因此,Cat使用Animal的某些实例变量是完全正常的,因为 应该<{1}}。

你担心子类所做的事情会通过改变实例变量搞乱超类所做的事情。你可以通过从子类中抛出无意义的数据来做到这一点,但通常你不会这样做。您可以使用实例变量作为要使用它们的超类(否则您确实会搞砸它们),这应该记录下来。如果你仍然认为某人真的不应该使用你的实例变量那么Cat说明符是什么。

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