C++中多态

作者: 潘雪雯 | 来源:发表于2020-05-28 16:49 被阅读0次

多态成立的三个条件

  1. 有继承
  2. 有函数重写
  3. 有父类指针(父类引用)指向子类对象
#include <cstdlib>
#include <iostream>
using namespace std;
//多态成立的三个条件
//要有继承,虚函数重写,父类指针指向子类对象
 
class Parent
{
          private:
        int a   ;
          public: 
          Parent(int a =0)
          {
              this->a = a; 
          }
          virtual void print() //1,动手脚 特殊处理   虚函数表 
          {
              cout<<"我是巴巴"<<endl;
          }
};

class Child : public Parent
{
          private:
        int b   ;
        public: 
          Child(int a =0,int b =0):Parent(a)
          {
              this->b = b; 
          }
          virtual void print()
          {
              cout<<"我是儿子"<<endl;
          }
};

void HowToPlay(Parent *base)
{
    base->print();//2,动手脚会有多态发生  特殊处理
    //传来子类对象,执行子类的print函数,传来父类对象执行父类的print函数 
    //c++编译器根本不需要区分是子类对象还是父类对象
    //父类对象和子类对象分别有vptr指针  ===>虚函数表===>函数的入口地址
    //迟邦定(运行时,c++编译器才去判断) 
}

int main()
{
    Parent p1; //3,动手脚 用类定义对象的时候  c++编译器会在对象 中添加一个vptr指针 
    Child c1;
    HowToPlay(&p1);
    HowToPlay(&c1);
    system("pause");
    return 0;
}

多态原理

  1. 当类中声明虚函数时,编译器会在类中生成一个虚函数表
  2. 虚函数表是一个存储类成员函数指针的数据结构
  3. 虚函数表是由编译器自动生成与维护的
  4. virtual成员函数会被编译器放入虚函数表中
  5. 存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr指针)


    image.png
    image.png
    image.png

    说明1:通过虚函数表指针VPTR调用重写函数是在程序运行时进行的,因此需要通过寻址操作才能确定真正应该调用的函数。而普通成员函数是在编译时就确定了调用的函数。在效率上,虚函数的效率要低很多。
    说明2: 出于效率考虑,没有必要将所有成员函数都声明为虚函数

  • 证明vptr的存在
#include <iostream>
using namespace std;
//多态成立的三个条件
//要有继承,虚函数重写,父类指针指向子类对象
class Parent1
{
            private:
        int a   ;
            public: 
              Parent1(int a =0)
              {
                this->a = a; 
              }
              void print() //1,动手脚 特殊处理   虚函数表 
              {
                cout<<"我是巴巴"<<endl;
              }
};

class Parent2
{
      private:
        int a   ;
      public: 
          Parent2(int a =0)
          {
              this->a = a; 
          }
          virtual void print() //
          {
            cout<<"我是巴巴"<<endl;
          }
};

int main()
{
    printf("sizeof(Parent1):%d,sizeof(Parent2):%d\n",sizeof(Parent1),sizeof(Parent2));
    cout<<"hello..."<<endl;
    return 0;
}
  • vptr指针初始化
    对象在创建时,由编译器对VPTR指针进行初始化
    只有当对象的构造完全结束后VPTR的指向才最终确定
    父类对象的VPTR指向父类虚函数表
    子类对象的VPTR指向子类虚函数表


    image.png

相关文章

  • Swift 多态实现探究

    多态 父类指针指向子类对象 Swift 中多态的实现类似于 c++ 中的虚表 OC 多态实现利用的是 Runtim...

  • 深刻剖析之c++博客文章

    三大特性 封装、继承、多态 多态 C++ 虚函数表解析C++多态的实现原理 介绍了类的多态(虚函数和动态/迟绑定)...

  • C++中多态

    多态成立的三个条件 有继承 有函数重写 有父类指针(父类引用)指向子类对象 多态原理 当类中声明虚函数时,编译器会...

  • C++第六篇多态

    C++中的多态性分为编译时多态性和运行时多态性,编译时多态通过函数重载和模板体现,运行多态通过虚函数体现编译、连接...

  • C++学习笔记(面向对象)

    C++是一门面向对象的语言 类定义 & 对象 C++ 中的继承,多态,抽象

  • C++编译期多态和运行期多态

    C++多态有多种实现方式,在面对对象编程时,采用的是运行期多态,也称动态多态。在泛型编程中,多态基于模板的具现化与...

  • Go interface详解

      如Go method中提及,Golang没有明确支持多态,但是通过其他手段可以实现类似C++中的多态特性,即本...

  • C++ 中的多态

    首先说一个基本例子: //人类 class Human{public: void say(){ cout << "...

  • C++中的多态

    姓名:刘亚宁 学号:17101223434 转载自:http://blog.csdn.net/zybqmy/a...

  • 多态的C++实现

    多态的C++实现 1 多态的原理 什么是多态?多态是面向对象的特性之一,只用父类指针指向子类的对象。 1.1 多态...

网友评论

    本文标题:C++中多态

    本文链接:https://www.haomeiwen.com/subject/itjaahtx.html