概念

/* 继承 */
class A{};
class B : public A
{};
/* 组合 */
class C{};
class D
{
        C c;
};

上述代码中,A和B的关系就是继承,C和D的关系就是复用,他们都完成了类层次的复用。

继承是一种白箱复用,父类对子类基本是透明的,但是它一定程度上破坏了父类的封装。

组合是一种黑箱复用,C对D是不透明的,C保持着他的封装,D只能使用C的公有成员。

实际运用中应该使用继承还是组合呢?

实际尽量多去用组合。组合的耦合度低,代码维护性好。不过继承也有用武之地的,有些关系就适合继承那就用继承,另外要实现多态,也必须要继承。类之间的关系可以用继承,可以用组合,就用组合。

// Car和BMW Car和Benz构成is-a的关系,BMW是一辆车,使用继承
class Car {
protected:
        string _colour = "白色"; // 颜色
        string _num = "陕ABIT00"; // 车牌号
};

class BMW : public Car {
public:
        void Drive() { cout << "好开-操控" << endl; }
};

class Benz : public Car {
public:
        void Drive() { cout << "好坐-舒适" << endl; }
};

// Tire和Car构成has-a的关系,车有一个轮胎,使用组合
class Tire {
protected:
        string _brand = "Michelin";  // 品牌
        size_t _size = 17;         // 尺寸

};

class Car {
protected:
        string _colour = "白色"; // 颜色
        string _num = "陕ABIT00"; // 车牌号
        Tire _t; // 轮胎
};

也就是说,实际运用中,符合 is-a 就使用继承,符合 has-a 就使用组合,两个都符合,就优先使用组合。

C++继承使用详解(上)-CSDN博客

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐