【问题标题】:private member vs private ineritance私有成员与私有继承
【发布时间】:2020-09-04 00:29:26
【问题描述】:
  • 我有一个班级A我无法编辑
class A{
public:
    int thisCoolFuntion(){
        return 0;
    }
};
  • 我想创建一个使用thisCoolFuntion() 的类(我们称之为类BC
  • 我希望用户能够创建BC 的实例,但他没有有权访问thisCoolFuntion()

  • 我认为一种解决方案是进行private 继承:

class B : A{
public:
    int member;
    void setBMember(){
    member = thisCoolFuntion();
    }
};
  • 我还想过要有一个private 类型为A 的成员:
class C{
    A memberA;
    int member;
public:
    void setCMember(){
        member = memberA.thisCoolFuntion();
    }
};
  • 这两种解决方案似乎有效:
int main(int argc, const char * argv[]) {
    // insert code here...
    B b;
    b.setBMember();
    //b.thisCoolFuntion(); --> Error!
    C c;
    c.setCMember();
    //c.memberA.thisCoolFuntion(); --> Error!
    return 0;
}

问题:我应该如何比较这两个解决方案?我如何选择哪一个更适合我的项目?其中一个更快吗?或者一个需要更多的内存?是用户更普遍认可的其中之一吗?

【问题讨论】:

  • 私有继承也禁用强制转换,即 A* a = &b 不再被允许。
  • 不确定这是否真的是关于 SO 的话题(可能更多关于程序员),因此是评论而不是答案。这就是组合继承的区别。最好的论点是从模型的角度来看,类 B 是 是一个 A还是有一个 A。例如,一个学生 是一个人(这里首选继承),但是汽车有一个电机(这里首选组合)。原因不应该是技术上的,而是从建模的角度来看是什么关系。
  • Use private inheritance when you have to 因为私有继承比组合增加了更多的维护工作量。从长远来看,您可能还必须处理多重继承。

标签: c++ inheritance private private-members


【解决方案1】:

这两种方法被称为:inheritancecomposition

由于这两种方法都可以解决您的问题,因此您的问题的答案应该是您的应用程序所针对的design pattern

继承(public)表示is-a关系,而组合表示两个类之间的has-a关系。

private inheritance 的情况下,它更像是派生有一个基础,恕我直言,这听起来不对,因为恕我直言,这是合成的工作,而不是任何形式的继承。那么,既然私有继承和组合在逻辑上本质上是同一个意思,那么选择哪一个呢?

您需要确定哪种关系对您的应用程序更有意义(在A 类和B 类之间)。

  1. 如果答案是 B has-a A,那么使用组合(您的第二种方法)。
  2. 如果答案是 B is-a A,则使用继承(您的第一种方法)。

对于您发布的示例,我肯定会选择组合(您可以组合多个相同类型的东西)和一些样式指南(例如google c++ style guide)甚至建议不要使用私有继承,原因是类似于我已经写过的 - 私有继承有点令人困惑。

例如(组合与公共继承),

类多边形的最佳设计将使用composition,因为此语句有意义Polygon has a ordered sequence of Points,但不是此Polygon is-a ordered sequence of Points。在 C++ 术语中:

class Polygon {
  std::vector<Point> points;
};

虽然 logic_error 是一个异常(公共继承):

struct logic_error : public exception {
};

查看Difference between Inheritance and Composition

查看Private inheritance VS composition

【讨论】:

  • 私有继承不是“is-a”(即公共继承)而是“has-a”。从外部看,私有继承和组合没有太大区别
猜你喜欢
  • 2020-09-01
  • 2018-05-11
  • 2013-02-12
  • 2015-01-21
  • 2011-09-26
  • 2011-02-10
  • 2013-08-30
  • 1970-01-01
相关资源
最近更新 更多