当前位置:  开发笔记 > 编程语言 > 正文

为什么我们在C++中实际需要私有或受保护的继承?

如何解决《为什么我们在C++中实际需要私有或受保护的继承?》经验,为你挑选了3个好方法。

在C++中,我想不出一个我希望从基类继承private/protected的情况:

class Base;
class Derived1 : private Base;
class Derived2 : protected Base;

它真的有用吗?



1> Luc Touraill..:

当您想要访问基类的某些成员但不在类接口中公开它们时,它非常有用.私有继承也可以看作是某种组合:C++ faq-lite给出了以下示例来说明这个语句

class Engine {
 public:
   Engine(int numCylinders);
   void start();                 // Starts this Engine
};

class Car {
  public:
    Car() : e_(8) { }             // Initializes this Car with 8 cylinders
    void start() { e_.start(); }  // Start this Car by starting its Engine
  private:
    Engine e_;                    // Car has-a Engine
};

要获得相同的语义,您还可以编写汽车类如下:

class Car : private Engine {    // Car has-a Engine
 public:
   Car() : Engine(8) { }         // Initializes this Car with 8 cylinders
   using Engine::start;          // Start this Car by starting its Engine
}; 

但是,这种做法有几个缺点:

你的意图不太清楚

它可能导致滥用多重继承

它打破了Engine类的封装,因为您可以访问其受保护的成员

你被允许覆盖引擎虚拟方法,如果你的目标是一个简单的组合,这是你不想要的


在我看来,如果"有一个"不应该有任何继承,但应该有一个组成.我认为这是滥用继承的一个坏例子,因为它会混淆用户.
第二个例子是一个非常糟糕的例子,你最终会像这样:汽车:私人发动机,私人车轮,私人座椅
是的"has-a"不应该是继承.我使用私有继承"is-implemented-in-temrs-of".这实际上意味着"是一个",但作为一种黑客攻击.就像你重复使用了一段不是真的应该给这些后代的代码,但是嘿......

2> Johannes Sch..:

私人在很多情况下都很有用.其中只有一个是政策:

部分类模板专业化是这个设计问题的答案吗?.

另一个有用的场合是禁止复制和分配:

struct noncopyable {
    private:
    noncopyable(noncopyable const&);
    noncopyable & operator=(noncopyable const&);
};

class my_noncopyable_type : noncopyable {
    // ...
};

因为我们不希望用户具有noncopyable*对象的类型指针,所以我们私下派生.这不仅适用于不可复制的,也适用于许多其他此类类(政策是最常见的).


正如@litb在他的回答中所述,私有派生会阻止用户使用指针或对不可复制的引用来引用my_non_copyable_type的实例.
是的,这也阻止用户通过指向该noncopyable的指针进行删除.

3> Greg Rogers..:

公共继承模型IS-A.
非公开继承模型IS-IMPLEMENTED-IN-TERMS-OF.
收容模型HAS-A,相当于IS-IMPLEMENTED-IN-TERMS-OF.

萨特谈论这个话题.他解释了当你为实现细节选择非公开继承而非遏制时.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有