类的继承与组合
1.继承
如果A 是基类,B 是派生类,那么B将继承A 的数据和函数
class A
{
public:
void fun1(void);
void fun2(void);
};
class B
{
public:
void func3(void);
void func4(void);
};
int main()
{
B b;
b.fun1();//B从 A继承了函数fun1();
b.fun2();//B从A继承了函数fun2();
b.fun3();
b.fun4();
return 0;
}
C++“继承”特性可以提高程序的可复用性,但是要防止滥用“继承”。
使用继承的规则:
(1)如果类A与类B毫不相关,不可以为了增加B的功能而让B继承A的功能与属性,
(2)如果B是A的一种,则允许B继承A 的功能与属性,例如,男人是人的一种,男孩是男人的一种,那么man 可以在Human 中派生,Boy可以在man 中派生。
注意事项:
继承的概念在程序中与现实生活中并不完全相同,
比如说鸵鸟是鸟的一种,按理来说,应该从鸟类派生,但是鸵鸟不能飞,
圆是一种特殊的椭圆,按理来说,圆可以从椭圆中派生,但是椭圆有长轴和短轴,圆继承了长轴和短轴多此一举。
更加严格的规则是:如果逻辑上B属于A 的一种,并且A的所有功能和属性对B而言都有意义,则允许B继承A的功能和属性。
1.组合
如果逻辑上A是B的一部分,则不允许B从A派生,而是要和其他东西组合形成B.
class Eye
{
public:
void Look(void);
};
class Nose
{
public:
void Smell(void);
};
class Mouth
{
public:
void Eat(void);
};
class Ear
{
public:
void Listen(void);
};
//正确的设计
class Head
{
public:
void Look(void){m_eye.Look();}
void Smell(void){m_nose.Smell();}
void Eat(void){m_mouth.Eat();}
void Listen(void){m_ear.Listen();}
private:
Eye m_eye;
Nose m_nose;
Mouth m_mouth;
Ear m_ear;
};