1,什么是多态?
多态是指同样的消息被不同类型的对象界首市导致的不同行为,所谓小学时只对类的成员函数调用,不同的行为是指不同的实现,也就是调用了不同的函数。多态性提供接口与具体实现之间的另一层隔离,同时创建了使程序具有扩展性。事实上在程序设计中经常使用多态,的特性,最近简单的例子就是运算符对不同类型的数据对象运算。
多态的类型一般分为两类:
静态多态(编译时多态,早绑定):函数重载、运算符重载、重定义
动态多态(运行时多态,晚绑定):虚函数 父类指针(引用)保存 子类空间地址的目的 就是让算法通用。
2,什么是虚函数?
1.如何实现父类对各个派生子类的操作?
这里的操作是在继承父类成员的条件下,对子类继承的成员的操作,也就是调用
首先要实现父类对各个派生子类的操作,我们需要父类指针保存子类空间,利用这个方式实现父类算法通用。
总结:通过构建父类指针保存子类的空间,实现对各个子类的操作(实际上这里还并不行,但这是实现该功能的前提)!
在这个基础上,构建虚函数或者纯虚函数他才会成立,在主函数中有应当如何去调用,都是父类指针保存子类空间的这个前提!!
2,父类指针保存子类空间产生的问题。
我们的目的是需要操作各个子类,虽然实现了如何访问哥哥派生子类,但实际上还并未能操作子类。
#include<iostream>
using namespace std;
class animal
{
public:
void nameshow()
{
cout << "我是什么动物" << endl;
}
};
class cat :public animal
{
public:
void nameshow()
{
cout << "我是猫" << endl;
}
};
int main()
{
//通过父类指针保存子类空间,实现对各个派生类的操作
animal* p = new cat;
//但我们这里想要调用的是子类的成员,但结果是父类的成员
p->nameshow();
return 0;
}
由上例知道,通过父类指针保存子类空间是没问题的,但因为你是父类指针,调用时不是操作子类,而是父类,故还并未实现父类对子类的操作,此时我们在定义父类成员(一般为函数)时就添加了关键词virtual,也就是虚函数,引入虚函数,我们可以实现父类对子类的调用。
3,虚函数的定义
父类成员函数前加virtual修饰。
#include<iostream>
using namespace std;
class animal
{
public:
virtual void nameshow()
{
cout << "我是什么动物" << endl;
}
};
class cat :public animal
{
public:
void nameshow()
{
cout << "我是猫" << endl;
}
};
class dog :public animal
{
public:
void nameshow()
{
cout << "我是狗" << endl;
}
};
int main()
{
//通过父类指针保存子类空间,实现对各个派生类的操作
animal* p1 = new cat;
animal* p2 = new dog;
//成功调用
p1->nameshow();
p2->nameshow();
return 0;
}
通过关键词virtual我们将成员函数定义为虚函数,此时父类指针指向子类空间时,我们调用的就是子类的这个成员函数。
多态条件:有继承、子类重写父类的虚函数,父类指针 指向子类空间。
我们可将子类继承父类的成员当做链接父类与子类的桥梁,父类指针指向各个子类空间就是实现各个桥梁,virtual就是实现父类通过桥梁到子类。
标签:函数,子类,什么,多态,父类,nameshow,指针 From: https://blog.51cto.com/u_16121555/6504565