动态联编
-
有时候我们并不希望某些环节在编译阶段完成,而需要它在程序运行时才可以确定将要调用的函数,称为动态联编。动态联编提高了编程的灵活性和程序的易维护性,但与静态联编相比,函数调用速度慢。
-
虚函数是实现动态联编的基础,它是一种动态的重载方式,它允许在运行时建立函数调用与函数体之间的关系。
-
虚函数是一个在基类中声明为virtual的函数,并在一个或多个派生类中被重新定义的成员函数,虚函数的声明格式如下:
virtual <返回值类型> <函数名>(<参数表>); -
基类中声明为virtual的函数一般在派生类中需要重新定义,在重新定义时,参数的类型和个数必须相同,一旦一个函数被声明为虚函数,则无论声明它的类继承了多少层,在每一层派生类中该函数都继续保持虚函数的特性。
-
ps:虚函数与重载不同,虚函数的参数类型个数完全相同。
#include <iostream>
using namespace std;
//动态联编-虚函数
class Shape{
int x;
int y;
public:
Shape(int px,int py):x(px),y(py)
{
cout<<"construct Shape"<<endl;
}
virtual float area() //基类中的area方法声明为虚函数
{
return 0;
}
};
class Rectangle:public Shape{
int w;
int h;
public:
Rectangle(int px,int py,int pw,int ph):Shape(px,py),w(pw),h(ph)
{
cout<<"construct Rectangle"<<endl;
}
float area()
{
return w*h;
}
};
class Circle:public Shape{
int r;
public:
Circle(int px,int py,int pr):Shape(px,py),r(pr)
{
cout<<"construct Circle"<<endl;
}
float area()
{
return 3.14*r*r;
}
};
int main()
{
Rectangle a(30,40,4,8);
Circle b(30,40,4);
Shape *p=&a;
cout<<a.area()<<endl;
cout<<p->area()<<endl;
p=&b;
cout<<b.area()<<endl;
cout<<p->area()<<endl;
return 0;
}
运行结果: