`
xlover
  • 浏览: 244441 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++中的动态绑定即多态的意义和原理

 
阅读更多

首先梳理一下概念:
1.什么是绑定?(What's the definition of binding?)
将函数体和函数调用关联起来,就叫绑定!

2.什么是早绑定?
早绑定是指在程序运行之前,即编译和链接是执行的绑定就是早绑定!

3.什么事迟绑定?
迟绑定就是指发生在运行时,基于不同类型的对象。对函数调用不同的函数体是发生的绑定。当一种语言要实现迟绑定是,必须有某种机制去确定对象的具体类型,然后调用适当的成员函数!

其次我们来看一个小例子:
class Animal{

    public:
        virtual void sleep()
        {
            cout<<"Animall sleep!"<<endl;
        }

        void breath()
        {
            cout<<"Animall breath!"<<endl;
        }
};

class Fish:public Animal
{
    public:
        void sleep()
        {
            cout<<"Fish sleep!"<<endl;

        }

        void breath()
        {
            cout<<"Fish breath!"<<endl;
        }

};
int main()
{

    cout << "Hello world!" << endl;
    Fish f;
    Animal* a=&f;
    a->breath();
    a->sleep();
    return 0;
}
程序运行结果:Animall breath;
              Fish sleep;

我们可以看到虽然a为指向Animal的指针,但是当调用sleep是却是Fish sleep:

这其实就是多态的性质,当父类指针指向子类对象时,这是会调用子类虚表中的虚函数,

当然如果是非虚函数,则没有该类没有虚表,则只会按指针去找代码区中的函数实现。

当然父类指针就会找到父类里的函数,所有输出会是animal breath!

4.这种特性是怎么实现的呢?

首先,在C++中,虚函数用virtual关键字标示。当子类重写父类的虚函数时,在子类中自动的该函数也是虚函数!

对于带有虚函数的类,在数据区里会有其对应的一个虚函数表。而且每一个虚函数表都会有一个虚指针VTPR。如果是同一类型的对象,则虚函数指针指向同一地址。

那让我们再来看看多态的实现机制


首先父类会有一个虚函数表,子类对象也对应一个虚函数表,虚函数指针是在对象的构造函数调用时生成的。

当把一个子类对象赋值给父类指针时,由于虚函数指针只是属于对象的,所以父类指针中的虚函数指针则是子类的!

但调用虚函数时,会根据这个虚函数指针去虚函数表里寻找。所以调用的代码和对象的类型相关。










分享到:
评论

相关推荐

    C++构造和析构的多态

    ### C++构造和析构中的多态实现 在C++编程语言中,多态是一种重要的特性,它允许程序员编写能够处理不同数据类型的代码。多态的实现通常依赖于虚函数和虚函数表(vtable)。然而,在构造函数和析构函数中调用虚函数...

    多态代码实例

    在面向对象编程中,多态分为静态多态(编译时多态)和动态多态(运行时多态)。静态多态主要通过函数重载和运算符重载实现,而动态多态则主要依赖于虚函数。 虚函数是在基类中声明的,并且被派生类重写的成员函数。...

    C++多态的原理

    总结,C++的多态性通过虚函数和虚表机制实现了动态绑定,使得在继承体系中可以调用派生类的特定实现,提高了代码的灵活性和可扩展性。理解这一机制对于深入学习C++和设计面向对象的程序至关重要。

    C++和Java多态的区别

    - **动态绑定**:Java中的方法调用分为静态绑定(如静态方法调用)和动态绑定(如实例方法调用)。动态绑定是指在运行时根据对象的实际类型来决定调用哪个方法。 - **方法调用指令**:JVM提供了四种方法调用指令,...

    深入理解C++的动态绑定和静态绑定

    在C++编程语言中,动态绑定和静态绑定是两种关键的多态实现方式,它们对于理解和编写高效、灵活的代码至关重要。多态性允许我们通过一个共同的基类接口访问不同派生类的对象,从而提高了代码的重用性和可扩展性。 ...

    浅谈c++的精髓之继承和多态

    ### 面向对象编程与C++中的继承和多态 #### 1. 面向对象编程思想的诞生 面向对象编程(Object-Oriented Programming, OOP)的引入,是为了克服传统面向过程编程的一些局限性。面向过程编程,如C语言,更侧重于按...

    C++作业789 链表、多态和复数相关文件操作

    在C++编程中,链表、多态和复数是重要的数据结构和概念,它们在实际编程中有着广泛的应用。让我们分别深入探讨这三个主题,并结合给出的文件名,推测这可能是一个综合性的作业,旨在帮助学生掌握这些核心概念。 ...

    C++中的虚函数与多态

    在C++中,多态主要有两种形式:静态多态(Static Polymorphism)和动态多态(Dynamic Polymorphism)。静态多态主要通过模板、重载运算符和函数重载等实现,编译器在编译期间就能确定调用哪个函数。而动态多态则依赖...

    C++ 多态 实例

    6. **动态绑定(动态多态)**:在C++中,虚函数的调用是动态绑定的,也就是说,直到运行时才能确定调用哪个版本的函数。 通过以上概念和示例,初学者可以开始构建多态程序。在这个实例中,你可能会看到如何创建基类...

    C++动态绑定解密

    本文将深入探讨动态绑定的概念、原理及其在C++中的应用。 #### 二、动态绑定的重要性 当设计系统时,开发者通常面临以下挑战: 1. **接口与实现的分离**:开发者可能清楚所需的接口(即功能需求),但不确定最合适...

    1.继承的本质和原理 2.派生类的构造类型 3.重载、覆盖、隐藏 4.静态绑定和动态绑定 5.多态 vfptr和vftbale

    1.继承的本质和原理 2.派生类的构造类型 ...4.静态绑定和动态绑定 5.多态 vfptr和vftbale 6.抽象类的设计原理 7.多继承以及问题 8.虚基类 vbptr和vbtable 9.RTTI 10.C++四种类型强转 11.继承多态常见笔试面试题分享

    C++多态day15

    总结来说,C++中的多态性是通过虚函数、纯虚函数、抽象类和动态绑定来实现的。它提高了代码的重用性和可维护性,是构建复杂软件系统的重要工具。理解和熟练掌握多态性,将有助于提升C++编程的水平。

    C++之多态实现机制剖析

    在C++编程语言中,多态(Polymorphism)是一种核心特性,它允许我们使用一个接口来表示多种不同的类型,增强了代码的灵活性和可扩展性。多态的实现主要依赖于虚函数(Virtual Functions)和纯虚函数(Pure Virtual ...

    c++多态实现及原理1

    C++多态实现及原理1 C++中的多态性是指在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,...

    C++虚函数多态的工作原理

    C++的虚函数是实现多态性的重要机制,它允许我们通过基类指针或引用来...这种机制在处理复杂继承关系和动态绑定时非常有用,是C++面向对象编程的核心特性之一。理解这一机制对于编写高效、可扩展的C++代码至关重要。

    C++多态的实现及原理详细解析

    总结来说,C++的多态性通过虚函数、虚表和动态绑定机制,实现了对象的动态类型检查和功能的灵活扩展,为编写可扩展和可维护的代码提供了强大的工具。理解这些概念是深入掌握C++面向对象编程的关键。

    C++中的静态多态和动态多态

    的C++已经是个多重泛型编程语言(multiparadigm programming lauguage),一个同时支持过程形式(procedural)... C++支持多种形式的多态,从表现的形式来看,有虚函数、模板、重载等,从绑定时间来看,可以分成静态多态和

    c++复习资料大全 指针多态 函数 继承类等

    在C++中,多态分为静态多态(编译时多态)和动态多态(运行时多态)。静态多态主要通过函数重载和运算符重载实现;动态多态则是通过虚函数和纯虚函数实现,它允许我们创建抽象基类和派生类,实现接口的统一和动态...

    C++实验代码(关于类与多态的实验)

    在C++中,有两种主要的多态形式:静态多态(编译时多态)和动态多态(运行时多态)。静态多态主要通过函数重载和运算符重载实现,而动态多态则依赖于虚函数和抽象类。虚函数在基类中声明,允许子类覆盖其行为,从而...

    C++简单应用程序多态和派生的应用

    在C++中,有两种类型的多态:静态多态(编译时多态)和动态多态(运行时多态)。静态多态主要通过函数重载和运算符重载实现,而动态多态则依赖于虚函数(virtual functions)。 在上面的代码中,`Animal`的`...

Global site tag (gtag.js) - Google Analytics