C++继承使用详解(下)
·
概念
/* 继承 */
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 就使用组合,两个都符合,就优先使用组合。
更多推荐



所有评论(0)