一、静态转为动态
二、早绑定转变为晚绑定
- 绑定:将函数体和函数调用关联起来
- 早绑定,在程序运行之前(也就是编译和链接时)
- 迟绑定发生在运行时,基于不同类型的对象。当一种语言实现迟绑定时,必须有某种机制确定对象的具体类型然后调用合适的成员函数。
例子
class Animal
{
public:
virtual void sleep() //虚函数
{
cout << "Animal sleep!" << endl;
}
void breath()
{
cout << "Animal breath!" << endl;
}
};
class Fish :public Animal
{
public:
void sleep() //函数重写,这里可以添加virtual,也可以不添加
{
cout << "Fish sleep!" << endl;
}
void breath()
{
cout << "Fish breath!" << endl;
}
};
int main()
{
Fish f;
Animal* a = &f; //基类指针指向派生类
a->breath();
a->sleep();
return 0;
}
// 结果: Animal breath!
// Fish sleep!
//结果解析:a是指向Animal(基类)的指针,指向派生类对象,调用基类的breath()函数;
//调用sleep(派生类 )的Fish sleep。 sleep函数是虚函数,在Fish中重写(覆盖)了基类;
//但breath()函数不是虚函数,在Fish(派生类)里面也有一个同名的函数,发生了同名隐藏。
早绑定的优点是:
晚绑定的优点是:
三、继承转变为组合
优先使用对象组合,而不是类继承。
示例
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;
};
四、编译时依赖转变为运行时依赖
五、紧耦合转变为松耦合
|