多态-01
多态涉及的内容比较多,打算分三部分今天说第一部分。
一、 什么是多态?
本人理解为:调用同样的语句能够有多种不同的表现形态
二、 例子
class person{
public:
virtual void WhatICanDo()
{
}
};
class Student:public person
{
public:
virtual void WhatICanDo()
{
cout << "我会学习\n";
}
};
class Teacher :public person
{
public:
virtual void WhatICanDo()
{
cout << "我会教书\n";
}
};
void main()
{
person *p = new Student();
p->WhatICanDo();
Teacher p1;
person &b = p1;
b.WhatICanDo();
}
运行结果:
分析:实现多态有三个重要的条件,1.继承;2.虚函数重写;3.基类的指针或者引用
三、 多态如何实现?
其实主要就靠virual关键字,告诉编译器这个函数要支持多态,不要根据指针的类型或者引用的类型决定调用函数,而是要根据所指的实际类型决定如何调用。接下来我来讲讲实现原理,如有不合适的地方请留言指正,共同进步。
当类型中声明virtual函数的时候,编译器会在类中生成一个虚函数表。这里的虚函数表顾名思义也就是用来存储虚函数的数据结构,只不过这个虚函数表是由编译器自己生成与维护的。当类中存在虚函数时,创建对象的同时编译器会自动为该对象生成一个vptr指针,这个指针指向该对象所对应虚函数表,值得注意的是,每个对象都对应一个虚函数表。我还是给大家画个图吧