一、什么是多态?
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。举个例子比如我们有一个动物类,这个动物类有个行为函数(这个行为函数是虚函数,虚函数就是函数返回值前面加virtual关键字),有一个狗类,一个猫类继承了这个动物类,并且重写了动物类的行为函数,然后我们用动物类的指针或引用接收狗或猫类对象,就会产生不同行为,就形成了多态。
例子实现如下
我们先设置一个动物类,
class Animal
{
public:
//有virtual关键字的是虚函数
virtual void speak()
{
cout << "动物在说话" << endl;
}
};
再创建一个猫类和一个狗类继承并重写动物类的虚函数
class Cat :public Animal
{
//此处virtual可省略
virtual void speak()
{
cout << "猫在喵喵说话" << endl;
}
};
class Dog :public Animal
{
//此处virtual可省略
virtual void speak()
{
cout << "狗在汪汪说话" << endl;
}
};
然后我们创建一个说话函数
void DoSpeak(Animal &animal)
{
animal.speak();
}
并给这个函数传入不同参数就可以产生不同的效果,下面是测试代码
void test01()
{
Cat cat;
//父类引用接收子类对象
DoSpeak(cat);
Dog dog;
//父类引用接收子类对象
DoSpeak(dog);
}
我们可以看到不管是狗对象还是猫对象都可以传递给DoSpeak函数,DoSpeak的函数参数不应该是animal类吗?怎么可以是猫类和狗类对象,在看它的运行结果,同一函数出现了不同的运行结果,这就是多态。
二、 多态的优势
1、组织结构性清晰;
2、代码可读性高;
可以让别人一看你的代码就知道你写的什么。
3、修改关闭,扩展开放,便于后期扩展和维护;不用修改原来的代码,只需要追加新代码在维护时。比如上面例子中我们需要些牛说话,马说话直接附加就行不用修改与原来代码。
三、多态形成的三大条件
1、要发生继承。
2、子类要重写父类中的虚函数(返回值、函数名、参数列表一模一样叫函数的重写,重写虚函数时virtual关键字可省略)。
3、父类指针或引用指向子类对象(void DoSpeak(Animal &animal) Cat cat; DoSpeak(cat);)这里传给父类animal引用的是子类cat对象.