多态性之动态联编 虚函数

#include<iostream.h>
class point //动态联编可以得到预期的输出
{

private:
 float x,y;
public:
 void setcon(float i,float j) {x=i;y=j;}
 virtual double area(){return 0.0;}//要使用动态联编,必须将函数说明为虚函数,这只要将
};//将关键字virtual放在类中该函数的函数说明之前即可。使用virtual修饰的成员函数称为虚函数
const double pi=3.14159;//
class circle:public point{
private:
 double radius;
public:
 void setsize(double r){radius=r;}
 virtual double area(){return pi*radius*radius;}//虚函数只能是类中的一个成员函数,但不能是静态成员
};//关键字virtual指示c++编译器,在运行时确定函数调用pp->area()所要调用的函数,即对该调用进行动态联编。
void main()
{

 point p;
    double a=p.area();
    cout<<"The area of the point p is"<<a<<endl;
 circle c;
 c.setsize(3.65637);
 a=c.area();
 cout<<"The area of the circle c is"<<a<<endl;
 point *pp;
 pp=&c;//程序在运行时根据指针pp指向的实际对象,调用该对象的成员函数
 cout<<"The area of the pp->area() is"<<pp->area()<<endl;
 cout<<"/n";
}
/*虚函数声明只能出现在类声明中函数原型中,而不能在成员的函数体实现的时候。必须由成员函数
来调用或者是通过指针、引用来访问虚函数。如果通过对象名来访问虚函数,则联编在编译过程中认为是静态联编*/

/*虚函数的访问权限不影响对它进行动态联编
class base{
public:
virtual void fun()
};
class derived:public base{
private:
void fun();
};
虽然派生类中的fun()和基类中的fun()的访问权限不一样,但它仍是虚函数.所以:
derived d;
base& b=d;//引用
b.fun();//调用derived::fun()
*/

/*虚函数只能是类中的一个成员函数,但不能是静态成员,关键字virtual用于类
中该函数的说明中。例如:


  class A{
  public:
  virtual void fun();
  };
void A::fun(){}
当在派生类中定义了一个同名的成员函数时,只要该成员函数的参数个数和相应类型以及
它的返回类型与基类中同名的虚函数完全一样,则无论是否该成员函数使用virtual,它都将
成为一个虚函数
*/

/*
使用虚函数保证了在通过一个基类类型的指针(包括引用)调用一个虚函数时,c++系统对
该调用进行动态联编。但是,在通过一对象访问一虚函数时使用静态联编
point p;
cicle c;
p=c;
cout<<p.area();//调用p中的area
*/

/*如果派生类中没有对基类的虚函数进行重定义,则它继承基类中的虚函数

class base{
public:
virtual void fun()
};
class derived:public base{
//没有重定义fun();
};
derived类将继承base类的虚函数fun(),所以

 derived d;
 base& b=d;
 b.fun();//调用derived类中从base类继承的fun()

如果从derived派生的类重定义了fun(),则在该派生类中的这个函数仍是虚函数
例如:
class derived1:public derived {
public:
void fun();
};
派生类derived1中的函数fun是虚函数,所以
derived1  d1;
derived& d=d1;//引用
d.fun();//调用derived1::fun()
base& b=d1;
b.fun()//调用derived1::fun()
*/


/*
在调用中对虚函数使用成员名限定可以强制c++对该函数进行静态联编。
例如:
derived1  d1;
derived& d=d1;//引用
d.derived::fun();//调用base::fun()
base& b=d1;
b>base::fun();//调用base::fun()
*/


/*一个类中的虚函数说明只对派生类中重定义的函数有影响,对它的基类中的函数无影响,例如:
class A{
public:
void fun();
};

class B:public A{
public:
virtual void fun();
};

class C:pubilc B{
public:
void fun();
};
A类中的fun不是虚函数,所以
C c;
A& a=c;
a.fun();//调用A::fun();
个人认为virtual覆盖基类,这时A类中的fun没有被覆盖
*/ 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值