多态
知识点1【多态之虚函数】
1、多态的分类
静态多态(静态联编):在编译阶段就可以确定函数的调用地址,并产生代码。(函数重载、运算符重载、重定义)
动态多态(动态联编):在运行的时候,确定函数的调用地址。(虚函数)
2、虚函数的引入:
需求:设计一个算法,操作父类派生出的所有子类;
3、父类指针(引用)指向子类空间(别名)带来的问题
#include <iostream>
using namespace std;
class Animal
{
public:
void speak()
{
cout << "动物在说话" << endl;
}
};
class Dog : public Animal
{
public:
void speak()
{
cout << "狗在汪汪" << endl;
}
};
int main(int argc, char const *argv[])
{
Animal *p = new Dog;
p->speak();
return 0;
}
问题:父类指针 只能操作 子类空间的中的父类部分。没办法操作派生出的子类;
4、虚函数
使用关键字vrtual修饰的成员函数 叫做虚函数。
父类指针 可以 访问子类中重写父类的虚函数。
重写:有继承 子类重写父类的虚函数。函数名、返回值类型、形参必须和父类虚函数一模一样。
#include <iostream>
using namespace std;
class Animal
{
public:
//虚函数
virtual void speak()
{
cout<<"动物在说话"<<endl;
}
};
class Dog:public Animal
{
public:
//也是虚函数:子类重写父类的虚函数 子类中的virtual可以省略
virtual void speak()
{
cout<<"狗在汪汪"<<endl;
}
};
class Cat:public Animal
{
public:
void speak()
{
cout<<"猫在喵喵"<<endl;
}
};
//设计的算法(动物说话算法)
void AnimalSpeak