2016-08-05 33 views
-4

我正在学习继承的概念,特别是关于访问说明符,在这里我对protected访问说明符感到困惑。被保护的成员可以被基类成员函数和派生类成员函数访问。如果我们声明protected为访问说明符,则可能会搞乱基类的implementation。它总是更好地申报private下的数据成员,而不是保护,因为只有interface公开,而不是implementation部分。我们只声明一个类的私有部分中的变量以及它如何变成implementation?实施将在member functions完成吗?条款很混乱,任何人都可以澄清并解释我的条款?C++中的接口与实现。这是什么意思?

+1

提供评论atleast而不是down-voting: -/ –

+0

受保护的成员函数可能适用于子类可能需要的实用类型函数,但仍然不公开。它们也可以用于父类调用的虚函数,然后在子类中重写,以提供一些特定但尚未公开的操作。 –

+3

如果你使用它们,这些想法会变得更加清晰。现在你的问题不是很清楚。 – doctorlove

回答

2

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

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

接口是合同:这家伙写的接口说,“哎,我接受这样看待的东西“,而使用界面的人说:”好吧,我写的课程就是这样看的“。

一个接口是一个空壳,只有方法的签名,这意味着方法没有一个主体。界面不能做任何事情。这只是一种模式。

而在他的实施例的接口被(翻译成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访问不错。我们将继承作为一个“is-a”的关系来讨论。当我们说Cat继承自Animal时,我们也说CatAnimal。所以对于Cat来说使用Animal的一些实例变量是完全正常的,因为应该无论如何都属于Cat

你担心子类会通过改变实例变量来搞乱超类的功能。你当然可以通过从子类中抛出无意义的数据来做到这一点,但通常你不这样做。你可以使用实例变量作为他们想要使用的超类(否则你确实会搞砸功能),这应该被记录下来。如果您仍然认为有人不应该使用您的实例变量,那么这就是private说明符的用途。

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

+0

听起来他对一般的界面和实现有些困惑,所以我想我会回答这个问题。我应该将引用的示例更改为C++吗? –

+0

_“我应该将引用的示例更改为C++吗?”_是的,这样会更好,其他所有内容都会让未来的访问者感到困惑。 –