文章目录
1、多态与虚函数
多态性:指同一个操作作用于不同的对象就会产生不同的响应。
多态性分为静态多态性和动态多态性,其中函数重载和运算符重载属于静态多态性,虚函数属于动态多态性。
C++是依靠虚函数来实现动态和多态的。
静态联编
以函数重载为例,C++编译器根据传递给函数的参数和函数名决定具体要使用哪一个函数,称为联编。
编译器在编译过程中完成这种联编,在编译过程中进行联编叫静态联编或早期联编。
动态联编
编译程序在编译阶段并不能确切知道将要调用的函数,只有在程序执行时才能确定将要调用的函数,为此要确切知道该调用的函数,需联编工作在程序运行时进行,这种在程序运行时进行联编工作被称为动态联编,活成动态束定,又叫晚期联编。
静态联编和动态联编都属于多态性,它们是不同阶段对不同实现进行的不同选择。
同一个对象引用形参,在不同阶段被束定的类对象是不同的。C++规定动态联编是在虚函数的支持下实现的。
实现动态联编必须满足以下3个条件
1、必须把需要动态联编的行为定义为类的公共属性的虚函数;
2、类之间存在子类型关系,一般表现为一个类从另一个类公有派生而来;
3、必须先使用基类指针指向子类型的对象,然后直接或者间接使用基类指针调用虚函数。
为什么需要虚函数
1、动态联编是通过虚函数实现的,是动态实现类多态性的关键;
2、虚函数是动态联编的基础,是成员函数,而且是非静态的成员函数。
3、虚函数在派生类中可能有不同的实现,当使用这个成员函数操作指针或引用所标识的对象时,对该成员函数的调用采用动态联编方式。动态联编只能通过指针或引用标识对象来操作虚函数。(如果采用一般的标识对象来操作虚函数,将采用静态联编的方式调用虚函数。)
以下示例体现,没有虚函数带来的问题:
// 虚函数.cpp : 定义控制台应用程序的入口点。
#include <iostream>
using namespace std;
class base
{
public:
void disp()
{
cout << "hello,base" << endl;
}
};
class child1:public base
{
public:
void disp() //派生类child1中定义的disp()函数将base类中定义的disp()隐藏
{
cout << "hello,child1" << endl;
}
};
class child2 :public base
{
public:
void disp() //派生类child2中定义的disp()函数同样隐藏base类中定义的disp()
{
cout << "hello,child2" << endl;
}
};
void display(base *pb) //display()函数,以base指针作为参数
{
pb->disp();
}
int main