一、多态的概念及实现
1、什么是多态?
多态是 C++ 面向对象编程的重要特性之一,分为编译时多态(静态多态)和运行时多态(动态多态)。本文重点讲解运行时多态。
编译时多态主要通过函数重载和函数模板实现,通过不同的参数类型达到多种形态。而运行时多态是指完成某个行为(函数)时,传不同的对象来完成不同的行为,从而达到多种形态。
例如买票行为:普通人全价,学生优惠,军人优先。又如动物叫的行为:猫对象调用输出'喵',狗对象调用输出'汪汪'。
2、虚函数
类成员函数前面加 virtual 修饰,则该成员函数被称为虚函数。注意非成员函数不能加 virtual 修饰。
class Person {
public:
// 这里在成员函数 BuyTicket 前面加了 virtual,则 BuyTicket 就是虚函数
virtual void BuyTicket() {
cout << "买票 - 全价" << endl;
}
};
• 虚函数的重写/覆盖
虚函数的重写 (Override) 发生在派生类,基类中必须有一个被 virtual 修饰的虚函数。
重写是实现多态的关键。它的定义是:在派生类中提供一个与基类中某个虚函数具有完全相同函数名、参数列表、返回值类型的函数。
虚函数重写的目的就是为了在运行时,当通过基类指针或引用指向派生类对象时,能够调用派生类的版本,而不是基类的版本。这就是'动态绑定'。
// Person 类与 Student 类中的 buyticket 构成重写
class Person {
public:
virtual void buyticket() {
cout << "全价票" << endl;
}
};
class Student : public Person {
public:
virtual void buyticket() {
cout << "半价票" << endl;
}
};
注意:在重写基类虚函数时,派生类的虚函数在不加 virtual 关键字时,也可以构成重写(因为子类继承基类后,基类的虚函数被继承下来了,在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用。
// A 类与 B 类中的 func 构成重写
{
:
{}
};
: A {
:
{}
};


