多态
多态按字面意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。
如何实现多态
- 使用虚函数(Virtual Function)
- 我们在基类中定义一个虚函数,这个函数可以在任何派生类中被 “重写” 或者说 “定制”。
- 使用关键字
virtual
来声明。
- 创建派生类并重写虚函数
- 在派生类中,我们提供该虚函数的具体实现。
- 通过基类的引用或指针调用虚函数
- 当我们使用基类类型的指针或引用来调用虚函数时,实际调用的是对象的实际类型(派生类)中的函数版本
代码如下
#include <iostream>
using namespace std;
class RemoteCon
{
public:
virtual void openUtils()
{
cout << "遥控器的开被按下" << endl;
}
};
class TvRemoteCon : public RemoteCon
{
public:
void openUtils() override
{
cout << "电视遥控器的开被按下" << endl;
}
void testFunc()
{
}
};
class RoundspeakerCon : public RemoteCon
{
public:
void openUtils() override
{
cout << "音响遥控器的开被按下" << endl;
}
};
class LightCon : public RemoteCon
{
public:
void openUtils() override
{
cout << "灯光遥控器的开被按下" << endl;
}
};
void test(RemoteCon& r)
{
r.openUtils();
}
int main()
{
RemoteCon *r = new TvRemoteCon;
r->openUtils();
RemoteCon *r2 = new RoundspeakerCon;
r2->openUtils();
RemoteCon *r3 = new LightCon;
r3->openUtils();
TvRemoteCon tvRemote;
test(tvRemote);
return 0;
}
在这个例子中,不同的对象(TvRemoteCon
和 TvRemoteCon
)以他们自己的方式“开”,尽管调用的是相同的函数 openUtils
。这就是多态的优势(相同接口,不同的行为)。
为什么要使用多态
- 灵活性:允许我们编写可以处理不确定类型的对象代码。
- 可扩展性:我们可以添加新的派生类而不必修改使用基引用或指针代码。
- 接口与实现分离:我们可以设计一个稳定的接口,而将具体的实现留给派生类去处理。