21
2019
09

C++学习大纲:C++ 消息(成员函数调用)的动态绑定

1. 消息的多态性


    C++把类看作类型,把以public方式(严格讲:只有public方式)继承的派生类看做基类的子类型,这样就使得在C++面向对象程序中存在下面的三种多态:


    1)对象类型的多态:派生类对象的类型既可以是派生类,也可以是基类。


    2)对象标志的多态:基类的指针或引用可以指向或引用基类对象,也可以指向或引用派生类对象。(但是派生类的指针只能指向或引用派生类对象,不能指向或引用基类对象,可以理解为可以将多的给少的,但是不能把少的给多的。)


    3)消息的多态,一个可以发送到基类对象的消息,也可以发送到派生类对象。




2. 静态绑定


    在编译时刻绑定数据的类型。(默认)




3. 动态绑定


    在运行的时候绑定数据的类型。

class A
{
    int x,y;
  public:
    void f();
}
 
class B: public A
{
    int z;
  public:
    void f();
    void g();
}
 
void func1(A& x)
{
    x.f();//调用A::f,因为C++是静态绑定
}
 
void func2(A* p)
{
    p->f();//调用A::f,因为C++是静态绑定
}

3. 虚函数与消息的动态绑定


    1)虚函数的定义


        在函数返回类型前面加上virtual

class A
{...
  public:
    virtual void f();//虚函数
}

限制:

         a. 只有类的成员函数才可以是虚函数


         b. 静态成员函数不能是虚函数


         c. 构造函数不能是虚函数


         d. 析构函数可以是(往往)是虚函数



    2)虚函数的动态绑定


        基类中的一个成员函数如果被定义成虚函数,则在派生类中定义的与之相同型构的成员函数是对该基类成员函数的重定义(或称覆盖,override)。


        相同型构:函数名相同、参数类型和个数相同、返回值类型相同或者是基类成员函数返回值类型的派生类

class A
{
    int x;
  public:
    virtual void f();
}
 
class B: public A
{
    int y;
  public:
    void f();
    void g();
}
 
A *p = new B;
p->f(); //OK,调用B的f
p->g(); //Error,因为A中没有g
((B*)p)->g(); //OK,调用B的g

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/haitaolang/article/details/70846369

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。