C++中虚函数

1.静态联编与动态联编

调用重载函数时,编译器根据调用时参数的类型与个数在编译时实现静态联编,将函数体与函数绑定,静态编译支持的多态性也称为编译时的多态性,或静态多态性

#include <iostream>

using namespace std;

class Point {

private:

        int x,y;

public:

      Point(int x = 0, int y = 0) {

           this->x = x; this->y = y;

      }

      double area(){

          return 0.0;

     }

};

const double PI = 3.14159;

class Circle : public Point {

private:

      double radius;

public:

      Circle (int x, int y, double r):Point(x, y) {

        radius = r;

     }

double area() {

      return PI*radius*radius;

}

};

int main() {

    Point PI(0,0);

    cout << "PI.area()=" << PI.area() << endl;

    Circle C1(10, 10, 20);

    cout << "C1.area()=" << C1.area() << endl;

    Point *Pp;

    Pp = &C1;

    cout << "Pp->area()=" << Pp->area() << endl;

    Point &Rp = &C1;

   cout << "Rp.area()=" << Rp.area() << endl;

 }

运行结果:PI.area() = 0

C1.area()=1256.64;

Pp->area()=0;

Rp.area()=0;

解释:Pp->area()究竟调用的是哪个eara(),c++此时进行的是静态联编,Pp的类型为Point,将从Point类中继承来的erea()绑定给Pp,因此调用的是Point中的area(),显示结果0.引用同指针

静态联编盲目根据指针或引用的类型而不是根据实际指向的目标确定调用的函数,导致错误。

 

动态联编则在程序运行的过程中,根据指针或引用实际指向的目标确定调用对应的函数,这也是在程序运行时才决定如何动作。虚函数(virtual function)允许函数调用与函数体之间的联系在运行时才建立,是实现动态联编的基础,可以在类中实现运行时的多态。

一般而言,虚函数实在基类中定义的,在派生类中将被重新定义,用于指明派生类中该函数的实际操作,从这个意思上讲,基类中定义的虚函数为整个类族提供了通用的框架,说明一般类所应该具有的对象。

动态联编的三个条件:

a.应满足类型兼容规则

b.在基类中定义虚函数,并且在派生类中重新定义虚函数

c.要有成员函数或则是通过指针,引用访问虚函数

#include <iostream>

using namespace std;

class Point {

private:

int x,y;

public:

Point(int x = 0, int y = 0) {

this->x = x; this->y = y;

}

virtual double area(){

return 0.0;

}

};

const double PI = 3.14159;

class Circle : public Point {

private:

double radius;

public:

Circle (int x, int y, double r):Point(x, y) {

radius = r;

}

double area() {

return PI*radius*radius;

}

};

int main() {

Point PI(0,0);

cout << "PI.area()=" << PI.area() << endl;

Circle C1(10, 10, 20);

cout << "C1.area()=" << C1.area() << endl;

Point *Pp;

Pp = &C1;

cout << "Pp->area()=" << Pp->area() << endl;

Point &Rp = &C1;

cout << "Rp.area()=" << Rp.area() << endl;

}

PI.area() = 0

C1.area()=1256.64;

Pp->area()=1256.64;

Rp.area()=1256.64;

 

 

注意:C++中,不能定义虚构造函数,因为当开始调用构造函数时,对象还未完成实例化,只有在构造完成后,才能成为一个类的对象。但虚函数可以是虚函数,而且通常申明为虚函数,只需要在基类中申明为虚析构函数,派生类的析构函数自动成为虚函数

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值