1. 什么是多态性?多态性是面向对象的一个重要特征。向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为【例如:上课了,学生上课,程序员在敲代码;下课了,学生下课,程序员还在敲代码。开玩笑的】。
其实我们也接触了一些多态性的例子,例如函数的重载、运算符重载、模板等...
从系统实现的角度,多态性分为两类:静态多态性【函数重载和运算符重载和模板属于这一类,静态多态性是编译时决定的,也叫编译时的多态性】。动态多态性是程序运行时才动态确定操作所针对的对象,又称为运行时的多态性,它是通过虚函数 (virtual function)实现的。
从编译器的角度,静态多态性就是静态关联【早期关联】,动态多态性就是动态关联【滞后关联】。
2. 一个虚函数【动态多态性,只可用于类族中的成员函数】的例子:
#include <iostream>
#include <string>
using namespace std;
class A{
public:
virtual void COUT(){ cout << "In A" << endl; }
};
class B :public A{
public:
void COUT(){ cout << "In B" << endl; }
};
int main()
{
A a1;
B b1;
A *ap = &a1;
ap->COUT();
ap = &b1;
ap->COUT();
}
我们知道下面这个例子会输出" In A " "In A",不懂可以看我的上一篇博客。
但是在class A的void COUT()函数前加上"virtual"关键字,结果将会输出"In A" " In B ",这就是虚函数的作用,由于它是指向B类的对象b1的,所以通过虚函数,它会使用派生类的该函数。【这是基类指针访问派生类对象的函数的例子,但是通过基类对象是无论如何都访问不了派生类非公有的成员的】
3. 虚函数使用规范
A .CPP规定,当一个成员函数被声明为虚函数【类外定义成员函数的时候不能加上 "virtual" 关键字】后,其派生类的