静态联编与动态联编

来源:互联网 发布:妙味课堂js课后作业 编辑:程序博客网 时间:2024/04/28 19:29

         在C++中,多态性主要是通过函数重载实现的。重载函数是指程序中对同名函数进行调用时,编译器会根据函数参数的类型和个数,决定该调用哪一段函数代码来处理这个函数调用。这种把函数调用与适当的函数代码相对应的动作,叫做联编。

         联编分为静态联编和动态联编。

         在编译阶段决定执行哪个同名的被调用函数,称为静态联编。

         在编译阶段不能决定执行哪个同名的被调用函数,只在执行阶段才能依据要处理的对象类型来决定执行哪个类的成员函数,这称为动态联编。

         多态性也分为静态和动态两种。静态多态性是指定义在一个类或一个函数中的同名函数,它们可根据参数表(类型及个数)区别语义,并通过静态联编实现,例如在一个类中定义不同参数的构造函数以及运算符的重载等。动态多态性是指定义在一个类层次的不同类中的重载函数,它们一般具有相同的参数表,因而要根据指针指向的对象所在类来区别语义,它通过动态联编实现。

         例:

class Point

{

public:

Point(double i,double j)

{

x = i;

y = j;

}

 

double Area() const {return 0.0;}

private:

double x,y;

};

class Rectangle : public Point

{

public:

Rectangle(double i,double j,double k,doublel):point(i,j)

{

w = k;

h = l;

}

double Area() const

{

return w*h;

}

private:

double w,h;

};

void fun(Point &s)

{

cout<<s.Area()<<endl;

}

void main()

{

Rectangle rec(3.0,5.2,15.0,25.0);

fun(rec);

}

该程序的结果为0

        s所引用的对象执行的Area()操作被关联到Point::Area()的实现代码上。因为默认静态联编。在程序的编译阶段,对s所引用的对象所执行的Area()操作只能是Point类的函数上。

       虚函数是动态联编的基础,它是引入派生概念之后用来表现基类和派生类成员函数之间的一种关系。虚函数在基类中定义,它也是一种成员函数,而且是非静态成员函数。

1.   虚函数的说明  

  说明虚函数的方法如下:  

  virtual   <类型说明符><函数名>(<参数表>)  

  关键字virtual说明的函数称为虚函数。这就意味着该成员函数在派生类中可能有不同的实现。当使用这个成员函数操作指针或引用所标识对象来操作虚函数,对该成员函数调用采取动态联编方式,即在运行时进行关联或束定。

动态联编只能通过指针或引用标识对象来操作虚函数,如果采用一般类型的标识对象来操作虚函数,则将采用静态联编方式调用虚函数。(一般类型的标识对象指什么?)

例:

#include

class Point

{

public:

 Point(double i,double j)

 {

  x=i;

  y=j;

 }

 virtual double Area() const{return 0.0;}

private:

 double x,y;

};

classRectangle:public Point

{

public:

 Rectangle(double i,double j,double k,doublel):Point(i,j)

 {

  w=k;

  h=l;

 }

 virtual double Area() const

 {

  return w*h;

 }

private:

 double w,h;

};

void fun(Point&s)

{

 cout<<s.Area()<<endl;

}

void main()

{

 Rectangle rec(3.0,5.2,15.0,25.0);

 fun(rec);

}

这时,程序按意图来执行了。

2.虚函数的限制

1)只有类的成员函数才能说明为虚函数。因为,虚函数仅适用于有继承关系的类对象,所以普通函数不能说明为虚函数。

2) 静态成员函数不能是虚函数。因为,静态成员函数不受限于某个对象。

3) 内联函数不能是虚函数,因为内联函数是不能在运行中动态联编的。即使虚函数在类的内部定义,编译时仍将其看作非内联的。

4) 构造函数不能是虚函数,因为构造时对象还是一片未定型的空间。只有在构造完成后,对象才能成为一个类的实例。

5) 析构函数可以是虚函数,而且通常说明为虚函数。说明虚函数的目的在于:使用delete运算符删除一个对象时,能确保析构函数被正确的执行。设置虚析构函数后,可以利用动态联编方式选择析构函数。

原创粉丝点击