• C++多态实现原理


    C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数

      1:用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。  

      2:存在虚函数的类都有一个一维的虚函数表叫做虚表,类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。  

      3:多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性。  

      4:多态用虚函数来实现,结合动态绑定.  

      5:纯虚函数是虚函数再加上 = 0;  

      6:抽象类是指包括至少一个纯虚函数的类。

    纯虚函数:virtual void fun()=0;即抽象类!必须在子类实现这个函数,即先有名称,没有内容,在派生类实现内容。

            多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。
            那么多态的作用是什么呢,封装可以使得代码模块化,继承可以扩展已存在的代码,他们的目的都是为了代码重用。而多态的目的则是为了接口重用。也就是说,不论传递过来的究竟是那个类的对象,函数都能够通过同一个接口调用到适应各自对象的实现方法。

      最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重写过的函数。因为没有多态性,函数调用的地址将是一定的,而固定的地址将始终调用到同一个函数,这就无法实现一个接口,多种方法的目的了。

     1 #include<iostream>
     2 
     3 class A{
     4 public:
     5     void foo(){std::cout<<"foo of A"<<std::endl;}
     6     virtual void print(){std::cout<<"Print A"<<std::endl;}
     7 };
     8 
     9 class B:public A{
    10 public:
    11     void foo(){std::cout<<"foo of B"<<std::endl;}
    12     void print(){std::cout<<"Print B"<<std::endl;}
    13 };
    14 
    15 int main(){
    16     A a;
    17     B b;
    18     A *p=&a;
    19     p->foo();
    20     p->print();
    21     p=&b;
    22     p->foo();
    23     p->print();
    24 
    25 }

    输出:

    foo of A
    Print A
    foo of A
    Print B
  • 相关阅读:
    Java 代码中如何调用 第三方Api
    如何编写README.md
    Gof 设计模式
    系统架构师-笔记
    我的账户
    软件设计师-成绩查询
    spring data jpa
    日志 logback
    spring boot 整合 Camunda
    Spring 中 bean 的生命周期?
  • 原文地址:https://www.cnblogs.com/ktao/p/7545977.html
Copyright © 2020-2023  润新知