1. 多态的概念
多态分为编译时多态(静态)和运行时多态(动态),其中编译时多态就是前文提过的函数重载和函数模板在编译时通过传不同的参数在编译时生成的各种具体类,而本篇我们专注于运行时多态(动态)。
那什么是运行时多态呢?
运行时多态就是去完成某个行为 (函数),可以传不同的对象就会完成不同的行为,就达到多种形态。
举例说明: 比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是优惠买票 (5 折或 75 折);军人买票时是优先买票。再比如,同样是动物叫的一行行为 (函数),传猫对象过去,就是'喵',传狗对象过去就是'汪汪'。
![图片]
![图片]
2. 多态的定义及实现
多态是一个继承关系的下的类对象,去调用同一函数,产生了不同的行为。比如 Student 继承了 Person。Person 对象买票全价,Student 对象优惠买票。
实现多态还有两个必须重要条件:
必须是基类的指针或者引用调用虚函数被调用的函数必须是虚函数,并且完成了虚函数重写/覆盖。
该图展现了虚函数的覆盖
![图片]
2.1 虚函数
说了这么多,那到底什么是虚函数呢?虚函数设计出来的意义是干什么的呢?
class Person {
virtual void BuyTicket() {
cout << "买票 - 全价" << endl;
}
};
虚函数的前提必须是成员函数。
【代码说明】:
2.2 虚函数的重写/覆盖
虚函数的重写/覆盖:派生类中有一个跟基类完全相同的虚函数 (即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称派生类的虚函数重写了基类的虚函数。如果派生类的虚函数前没有加 virtual 此时也构成虚函数的重写因为派生类继承基类时已经继承了虚函数,但是此种写法不规范不建议这样写。
【代码演示】:
namespace twg {
class Person {
public:
virtual void BuyTicket() {
cout << "买票 - 全价" << endl;
}
};
class Student : public Person {
public:
{
cout << << endl;
}
};
{
:
{}
};
: Animal {
:
{
std::cout << << std::endl;
}
};
: Animal {
:
{
std::cout << << std::endl;
}
};
{
animal.();
}
}
{
twg::Cat cat;
twg::Dog dog;
twg::(cat);
twg::(dog);
;
}


