C++ 私人会员vs私人惯性 我有一个类a,我无法编辑该类: 我想创建一个使用thisCoolFunction()的类(我们称它为classB或C)

C++ 私人会员vs私人惯性 我有一个类a,我无法编辑该类: 我想创建一个使用thisCoolFunction()的类(我们称它为classB或C),c++,inheritance,private,private-members,C++,Inheritance,Private,Private Members,我希望用户能够创建B或C的实例,但他无权访问ThisCoolFunction() 我认为一个解决方案是执行私有继承: struct logic_error : public exception { }; 我还想过要有一个a类型的private成员: 这两种解决方案似乎有效: 问题:我应该如何比较这两种解决方案?我如何选择哪个更适合我的项目?其中一个更快吗?还是需要更多的记忆?用户是否更普遍地认可其中一种方法?这两种方法称为:和 因为这两种方法都能解决您的问题,所以您的问题的答案应该是

我希望用户能够创建
B
C
的实例,但他无权访问
ThisCoolFunction()

  • 我认为一个解决方案是执行
    私有继承:

  • struct logic_error : public exception {
    };
    
    • 我还想过要有一个
      a
      类型的
      private
      成员:
    • 这两种解决方案似乎有效:

    问题:我应该如何比较这两种解决方案?我如何选择哪个更适合我的项目?其中一个更快吗?还是需要更多的记忆?用户是否更普遍地认可其中一种方法?

    这两种方法称为:和

    因为这两种方法都能解决您的问题,所以您的问题的答案应该是针对您的应用程序的
    设计模式

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

    私有继承
    的情况下,更像是派生有一个基,这听起来不对,因为这是合成的工作,而不是任何类型的继承。既然私有继承和组合在逻辑上基本上是同一回事,那么选择哪一个呢

    您需要决定什么样的关系对您的应用程序更有意义(类
    A
    和类
    B

  • 如果答案是
    B
    has-a
    a
    ,那么使用合成(第二种方法)
  • 如果答案是
    B
    是-a
    a
    ,那么使用继承(您的第一种方法)
  • 在您发布的示例中,我肯定会选择组合(您可以组合多个相同类型的内容),一些样式指南(例如)甚至建议永远不要使用私有继承,原因与我已经编写的类似-私有继承只是有点混乱

    例如(组合与公共继承)

    类多边形的最佳设计将使用
    合成
    ,因为此语句有意义
    多边形具有有序的点序列
    ,但不是此
    多边形是有序的点序列
    。在C++中:

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


    参见此部分。

    私有继承也会禁用强制转换,即不再允许使用
    A*A=&b
    。不确定这是否真的是关于SO的主题(可能更多关于程序员),因此是一个注释而不是答案。这就是组合和继承之间的区别。最好的论据是,从模型的角度来看,B类是a类还是a类。例如,一名学生是人(此处优先继承),但一辆汽车有一个马达(此处优先组合)。原因不应该是技术上的,而应该是从建模的角度来看关系是什么。相关的:因为私有继承比组合增加了更多的维护工作量。从长远来看,您可能还必须处理多重继承。私有继承不是“is-a”(即公共继承),而是“has-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;
    }
    
    class Polygon {
      std::vector<Point> points;
    };
    
    struct logic_error : public exception {
    };