组合(Composition)详解(含代码示例)

张开发
2026/5/30 16:14:34 15 分钟阅读
组合(Composition)详解(含代码示例)
组合是C面向对象中has-a有一个的关系指一个类将另一个类的对象作为自己的成员变量。它和继承is-a是两种最核心的复用方式组合优于继承是设计原则之一。一、核心概念关系A类has-aB类A有一个B本质将B类对象嵌入A类内存中特点强关联同生共死不破坏封装耦合度低复用B类功能不继承B类接口二、语法格式classB{// B类成员};classA{private:B b;// 组合A包含B对象};三、代码示例1基础组合人有一只手#includeiostreamusingnamespacestd;// 零件类手classHand{public:voidwave(){cout挥手endl;}};// 组合类人classPerson{private:Hand hand;// 人有一只手组合public:voidgreet(){hand.wave();// 调用手的功能cout你好endl;}};intmain(){Person p;p.greet();// 输出挥手 你好return0;}四、代码示例2带初始化的组合构造顺序组合构造顺序先构造零件再构造自身#includeiostreamusingnamespacestd;classCPU{public:CPU(){coutCPU构造endl;}};classMemory{public:Memory(){cout内存构造endl;}};// 电脑由CPU 内存组合classComputer{private:CPU cpu;Memory mem;public:Computer(){cout电脑构造endl;}};intmain(){Computer c;return0;}输出构造顺序plaintextCPU构造内存构造电脑构造五、代码示例3组合 vs 继承关键区别1. 继承is-a猫是动物classAnimal{};classCat:publicAnimal{};// Cat is-a Animal **2.组合has-a猫有一条尾巴**cppclassTail{};classCat{Tail t;// Cat has-a Tail};六、组合 vs 继承 对比表特性组合has-a继承is-a关系整体与部分一般与特殊耦合度低低耦合高强依赖复用方式包含对象继承父类接口/实现构造顺序先零件后整体先父类后子类设计原则✅ 优先使用⚠️ 谨慎使用七、为什么“组合优于继承”不破坏封装组合只调用公开接口不访问私有成员低耦合修改零件类不影响整体类灵活运行时可替换零件如换CPU避免继承滥用防止“类爆炸”八、总结组合A包含B对象 →has-a继承A是B的特例 →is-a设计原则能用组合就不用继承

更多文章