c++学习笔记十五

38、静态束定
   #include<iostream.h>
class Point
{
public: 
Point(double i,double j) { x = i;y = j; }
double Area() const { return 0; } 
private:
double x,y;
};
class Rectangle:public Point
{
public:
Rectangle(int i,int j,int k,int l);
double Area() const { return w*h; }
private:
double w,h;
};
Rectangle::Rectangle(int i,int j,int k,int l):Point(i,j)
{
w = k;
h = l;
}
void fun(Point &s)
{
cout<<s.Area()<<endl;
}
void main()
{
Rectangle rect(3.0,5.2,15.0,25.0);
fun(rect);   //输入为Rectangle类型,但函数参数实际上是Point类型。
}
总结:a.输入为Rectangle类型,但函数参数实际上是Point类型


39、动态束定
#include<iostream.h>
class Point
{
public: 
Point(double i,double j) { x = i;y = j; }
virtual double Area() const { return 0; } 
private:
double x,y;
};
class Rectangle:public Point
{
public:
Rectangle(int i,int j,int k,int l);
virtual double Area() const { return w*h; }     //虚函数只能进行一次初始化,指向同一个内存空间
private:
double w,h;
};
Rectangle::Rectangle(int i,int j,int k,int l):Point(i,j)
{
w = k;
h = l;
}
void fun(Point &s)
{
cout<<s.Area()<<endl;
}
void main()
{
Rectangle rect(3.0,5.2,15.0,25.0);
fun(rect);   //输入为Rectangle类型,但函数参数实际上是Point类型。
}
总结:a.虚函数只能进行一次初始化
      b.虚函数指向内存的同一个空间
      c.虚函数还在解决二义性问题有作用
动态束定要几个条件:
      a.只能通过指针或引用表示对象来操作虚函数
      b.还必须通过virtual虚函数


     动态束定
#include<iostream.h>
class A 
{
public:
virtual void act1()
{
cout<<"A::act1() called."<<endl;
}
void act2() { act1(); }
};
class B:public A
{
public:
void act1()  { cout<<"B::act1() called."<<endl; }
};
void main()
{
B b;
b.act2();
}
输出结果:B::act1() called.
原因: a.B从A公有继承,B是A的子类型。
       b.B中的act1()为虚函数;
       c.b.act2()调用A中act2(),进一步调用act1(),产生动态束定,运行时选择B::act1()


 总结:a.动态束定子类对象选择子类的虚函数
       b.静态束定子类对象选择父类的虚函数


如果将A::act2()的实现改为:
    void A::act2()
    {
     this->act1();
    }
输出结果是什么?为什么?
输出结果与(1)相同,即:B::act1() called.
原因:this指向操作该成员函数的对象,基于与(1)相同的原因,此处调用B::act1()。


(3)、如果将A::act2()的实现改为:
    void A::act2()
    {
     A::act1();
    }
  输出结果是什么?为什么?
输出结果:A::act1() called.
原因:此处增加了成员名限定,因此要进行静态束定,即调用的是A::act1()。


动态束定有三个条件:
》要有说明的虚函数
》建立起子类型关系
》调用虚函数操作的是指向对象的指针或对对象引用;或者是由成员函数调用
  虚函数


  派生类中对基类的虚函数进行替换时,要求派生类中说明的虚函数与基类中的被替换的虚函数之间
满足下列条件:
》参数个数:与基类的虚函数有相同的参数个数
》参数类型:与基类的虚函数的对应参数类型相同
》返回值类型:
》与基类的虚函数的返回值类型相同
》都返回指针或引用,并且派生类虚函数所返回的指针或引用的基类型是基类中被替换的虚函数所返回
  的指针或引用的基类型的子类型


  满足上述条件的派生类虚函数,可不加virtual说明。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值