C++虚函数产生的多态

编程入门 行业动态 更新时间:2024-10-07 18:25:53

C++虚<a href=https://www.elefans.com/category/jswz/34/1771370.html style=函数产生的多态"/>

C++虚函数产生的多态

C++虚函数产生的多态

1、先看下面代码,参考施雷老师课堂笔记

#include<iostream>
#include<vector>
#include <algorithm>
#include <functional>
using namespace std;/*
虚函数,静态绑定和动态绑定覆盖:
基类和派生类的方法,返回值、函数名以及参数列表都相同,而且基类的方法是虚函数,
那么派生类的方法就自动处理成虚函数,它们之间成为覆盖关系一个类添加了虚函数,对这个类有什么影响?
总结一:
一个类里面定义了虚函数,那么编译阶段,编译器给这个类类型产生一个唯一的vftable虚函数
表,虚函数表中主要存储的内容就是RTTI指针和虚函数的地址。当程序运行时,每一张虚函数表
都会加载到内存的.rodata区。总结二:
一个类里面定义了函数数,那么这个类定义的对象,其运行时,内存中开始部分,多存储一个
vfptr虚函数指针,指向相应类型的虚函数表vftable。一个类型定义的n个对象,它们的额vfptr
指向的都是同一张虚函数表总结三:
一个类里面虚函数的个数,不影响对象内存大小(vfptr),影响的是虚函数表的大小
*/
class Base
{
public:Base(int data = 10) :ma(data) {}// 虚函数virtual void show() { cout << "Base::show()" << endl; }// 虚函数virtual void show(int) { cout << "Base::show(int)" << endl; }
protected:int ma;
};
class Derive : public Base
{
public:Derive(int data = 20) :Base(data), mb(data) {}/*总结四:如果派生类中的方法,和基类继承来的某个方法,返回值、函数名、参数列表都相同,而且基类的方法是virtual虚函数,那么派生类的这个方法,自动处理成虚函数重写《=》覆盖   */void show() { cout << "Derive::show()" << endl; }
private:int mb;
};
int main()
{Derive d(50);Base *pb = &d;/*	pb->Base Base::show 如果发现show是普通函数,就进行静态绑定 call Base::showpb->Base Base::show 如果发现show是虚函数,就进行动态绑定了mov eax, dword ptr[pb]mov ecx, dword ptr[eax]call ecx(虚函数的地址) 动态(运行时期)的绑定(函数的调用)*/pb->show(); //静态(编译时期)的绑定(函数的调用)call  Base::show (01612DAh)/*Base::show(int) 是一个虚函数,此时就得动态绑定了mov eax, dword ptr[pb]mov ecx, dword ptr[eax]call ecx(虚函数的地址) 动态(运行时期)的绑定(函数的调用)*/pb->show(10); //静态绑定 call  Base::show (01612B2h)cout << sizeof(Base) << endl; // 4 8cout << sizeof(Derive) << endl; // 8 12cout << typeid(pb).name() << endl; // class Base*/*pb的类型:Base -> 有没有虚函数如果Base没有虚函数,*pb识别的就是编译时期的类型  *pb <=> Base类型如果Base有虚函数,*pb识别的就是运行时期的类型 RTTI类型pb->d(vfptr)->Derive vftable  class Derive */ cout << typeid(*pb).name() << endl; // class Base  class Derive /*Base的两个show函数都是普通的函数Base::show()Base::show(int)48class Base *class Base*//*给Base的两个show方法定义成virtual虚函数了Derive::show()Base::show(int)812class Base *class Derive*/return 0;
}

更多推荐

C++虚函数产生的多态

本文发布于:2023-11-30 14:13:22,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1651109.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:函数   多态

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!