[转] C++虚函数与虚函数表】的更多相关文章

前导 在上面的博文中描述了基类中存在虚函数时,基类和派生类中虚函数表的结构. 在派生类也定义了虚函数时,函数表又是怎样的结构呢? 先看下面的示例代码: #include <iostream> using namespace std; class A { public: virtual void funcA(){ cout<<"A"<<endl; } }; class B { public: virtual void funcB(){ cout<…
一.背景知识(一些基本概念) 虚函数(Virtual Function):在基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数.纯虚函数(Pure Virtual Function):基类中没有实现体的虚函数称为纯虚函数(有纯虚函数的基类称为虚基类).C++  “虚函数”的存在是为了实现面向对象中的“多态”,即父类类别的指针(或者引用)指向其子类的实例,然后通过父类的指针(或者引用)调用实际子类的成员函数.通过动态赋值,实现调用不同的子类的成员函数(动态绑定).正是因为这种…
//虚基类:一个类可以在一个类族中既被用作虚基类,也被用作非虚基类. class Base1{ public: Base1(){cout<<"Construct Base1!"<<endl;}; void foo();//普通函数 virtual void foo1(){cout<<"foo1 in Base1"<<endl;};//虚函数:可以在基类中实现(+{})或者直接定义成虚基类,\ 会出现错误:undefin…
1.静态的数组空间char a[10];sizeof 不能用于1:函数类型 2:动态的数组空间new3:位字段 函数类型:int fun();sizeof(fun())计算的是返回类型的大小,并不是函数大小,函数要在运行时才知道其大小,而sizeof是编译时操符号     动态分配数组:sizeof()只是符号表,是编译的时候确定大小的.动态分配是运行过程中得到大小的,所以sizeof不能计算动态分配的数组大小.如:以下程序就动 态分配了数组a[N].数组的长度N可输入确定,也可用程序中的变量确…
静态多态.动态多态 静态多态:程序在编译阶段就可以确定调用哪个函数.这种情况叫做静态多态.比如重载,编译器根据传递给函数的参数和函数名决定具体要使用哪一个函数.动态多态:在运行期间才可以确定最终调用的函数.需要通过虚函数+封装+继承实现. 虚函数 虚函数都必须有定义 虚函数一般用在继承中.多个子类继承同一基类,若在某种行为上不同的派生类有着自己的实现方式.这种情况我们就会用到多态.采用在基类中将此函数定义成虚函数,派生类中定义这个函数的不同实现.当我们使用基类的引用或指针调用一个虚成员函数时会执…
  首先,来看一个简单的JAVA类,Base. 1 public class Base { 2 String str = "Base string"; 3 protected void show( ){ 4 System.out.println(str); 5 init(); 6 } 7 protected void init(){ 8 System.out.println("Base init"); 9 } 10 } 然后,从Base类中派生一个子类Sub.并且在…
一.基类指针.派生类指针 父类指针可以new一个子类对象 二.虚函数 有没有一个解决方法,使我们只定义一个对象指针,就可以调用父类,以及各个子类的同名函数? 有解决方案,这个对象指针必须是一个父类类型,我们如果想通过一个父类指针调用父类.子类中的同名函数的话,这个函数是有要求的: 在父类中,eat函数声明之前必须要加virtual声明eat()函数为虚函数. 一旦某个函数被声明为虚函数,那么所有派生类(子类)中eat()函数都是虚函数. 为了避免你在子类中写错虚函数,在C++11中,你可以在函数…
当类中包含虚函数时,则该类每个对象中在内存分配中除去数据外还包含了一个虚函数表指针(vfptr),指向虚函数表(vftable),虚函数表中存放了该类包含的虚函数的地址. 当子类通过虚继承的方式从父类中派生出来,此时称父类为子类的虚基类.子类中将包含虚基表指针(vbptr),指向虚基类表(vbtable) 在单继承形式下,子类将完全获得父类的虚函数表和数据(假入父类中有虚函数的话).如果子类中重写了父类的虚函数,就会在虚函数表中原本记录父类中虚函数的地址覆盖为子类中对应的重定义后的该函数地址,否…
首先,面向对象程序设计(object-oriented programming)的核心思想是数据抽象.继承.动态绑定.通过数据抽象,可以使类的接口与实现分离,使用继承,可以更容易地定义与其他类相似但不完全相同的新类,使用动态绑定,可以在一定程度上忽略相似类的区别,而以统一的方式使用它们的对象. 虚函数的作用是实现多态性(Polymorphism),多态性是将接口与实现进行分离,采用共同的方法,但因个体差异而采用不同的策略.纯虚函数则是一种特殊的虚函数.虚函数联系到多态,多态联系到继承. 一.虚函…
C++ 虚函数&纯虚函数&抽象类&接口&虚基类   1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数. 多态性就是允许将子类类型的指针赋值给父类类型的指针,多态是通过虚函数实现的. 多态可以让父类的指针有“多种形态”,这是一种泛型技术.(所谓泛型技术,就是试图使用不变的代码来实现可变的算法). 2. 虚函数 2.1虚函数定义 在基类的类定义中,定义虚函数的一般形式: Virt…
1. 动态多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数. 多态性就是允许将子类类型的指针赋值给父类类型的指针,多态是通过虚函数实现的. 多态可以让父类的指针有“多种形态”,这是一种泛型技术.(所谓泛型技术,就是试图使用不变的代码来实现可变的算法). 2. 虚函数 2.1虚函数定义 在基类的类定义中,定义虚函数的一般形式: Virtual 函数返回值类型 虚函数名(形参表){函数体} 虚函数必须是类的…
1)C++利用虚函数来实现多态. 程序执行时的多态性通过虚函数体现,实现运行时多态性的机制称爲动态绑定:与编译时的多态性(通过函数重载.运算符重载体现,称爲静态绑定)相对应. 在成员函数的声明前加上virtual修饰,派生类可以不加virtual修饰,则声明之为虚函数.在派生类中可以重新定义从基类继承下来的虚函数.下面是一个例子,Rectangle是Shape的派生类,在类Rectangle中对Shape中的虚函数Draw()进行了重新定义: class Shape { public: virt…
http://www.cnblogs.com/fly1988happy/archive/2012/09/25/2701237.html 1. 多态 在面向对象语言中,接口的多种不同实现方式即为多态.多态是指,用父类的指针指向子类的实例(对象),然后通过父类的指针调用实际子类的成员函数. 多态性就是允许将子类类型的指针赋值给父类类型的指针,多态是通过虚函数实现的. 多态可以让父类的指针有“多种形态”,这是一种泛型技术.(所谓泛型技术,就是试图使用不变的代码来实现可变的算法). 2. 虚函数 2.1…
准备工作 1.VS2012使用命令行选项查看对象的内存布局 微软的Visual Studio提供给用户显示C++对象在内存中的布局的选项:/d1reportSingleClassLayout.使用方法很简单,直接在[项目P]选项下找到“visual属性”后点击即可.切换到cpp文件所在目录下输入如下的命令即可 c1 [filename].cpp /d1reportSingleClassLayout[className] 其中[filename].cpp就是我们想要查看的class所在的cpp文件…
C++面向对象中,虚函数与虚继承是两个完全不同的概念. 一.虚函数 C++程序中只要类中含有虚拟函数,编译程序都会为此类生成一个对应的虚拟函数跳转表(vtbl),该虚拟函数跳转表是一个又若干个虚拟函数体入口地址组成的一个线性表.派生类的虚拟函数跳转表的前半部分由父类的vtbl得出,但是里面的内容不一定相同,后半部分则对应着自己新定义的虚拟函数. class Employee { protected: char *Name; int Age; public: void changeAge(int…
转自:https://www.jianshu.com/p/02183498a2c2 面向对象的三大特性是封装.继承和多态.多态是非常重要的一个特性,C++多态基于虚函数和虚继承实现,本文将完整挖掘C++多态的应用.实现和内存分布. 多态的引入 重点:早绑定与运行时绑定 C++继承可以让子类继承另基类所包含的属性和方法,有时,子类虽继承了基类,却有些方法存在自己的实现.我们看下面这样一个例子,两个类动物(Animal)和人(Human).Human继承了Animal,Animal有呼吸方法,Hum…
白杨 http://baiy.cn “在正确的场合使用恰当的特性” 对称职的C++程序员来说是一个基本标准.想要做到这点,首先要了解语言中每个特性的实现方式及其开销.本文主要讨论相对于传统 C 而言,对效率有影响的几个C++新特性: 编译时开销 运行时开销 相关文档: C++编码规范与指导 C++异常机制的实现方式和开销分析 多处理器环境和线程同步的高级话题 C++0x(C++11)新特性点评 相对于传统的 C 语言,C++ 引入的额外开销体现在以下两个方面: 编译时开销 模板.类层次结构.强类…
C++三大特性:封装.继承.多态,今天给大家好好说说继承的奥妙 1.虚函数: C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现.子类可以重写父类的虚函数实现子类的特殊化. 2.纯虚函数: C++中包含纯虚函数的类,被称为是“抽象类”.抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象. C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”. C++中的纯虚函数也是一种“运行时多态”. 3.普通函数: 普通函…
1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class). 2. 虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class)只有声明而没有定义. 3. 虚函数和纯虚函数都可以在子类(sub class)中被重载,以多态的形式…
关键字virtual用于父类方法,如果传了一个子类对象,并且子类重写了父类的这个virtual方法,就会调用子类的方法.传谁就调用谁,这个就是多态.#include<iostream> using namespace std; class Biological{ public: virtual void range(){ cout<<"widely"<<endl; } void name(){ cout<<"biological…
一.虚函数的作用 以一个通用的图形类来了解虚函数的定义,代码如下: #include "stdafx.h" #include <iostream> using namespace std; class Graph { protected: double x; double y; public: Graph(double x,double y) { this->x=x; this->y=y; } virtual void showArea() { cout<…
多态性可分为两类:静态多态和动态多态.函数重载和运算符重载实现的多态属于静态多态,动态多态性是通过虚函数实现的. 每个含有虚函数的类有一张虚函数表(vtbl),表中每一项是一个虚函数的地址, 也就是说,虚函数表的每一项是一个虚函数的指针. 没有虚函数的C++类,是不会有虚函数表的. 两张图: 简单例子: 1 #include <iostream> 2 #include <windows.h> 3 4 using namespace std; 5 6 class base 7 { 8…
从例子入手,考察如下带有虚函数的类的对象内存模型: class A { public: virtual void vfunc1(); virtual void vfunc2(); void func1(); void func2(); virtual ~A(); private: int m_data1, m_data2; }; class B : A { public: virtual void vfunc1();; void func2(); virtual ~B(); private: i…
http://www.cnblogs.com/Ripper-Y/archive/2012/05/15/2501930.html http://blog.csdn.net/haoel/article/details/1948051/ 多态性可分为两类:静态多态和动态多态.函数重载和运算符重载实现的多态属于静态多态,动态多态性是通过虚函数实现的. 每个含有虚函数的类有一张虚函数表(vtbl),表中每一项是一个虚函数的地址, 也就是说,虚函数表的每一项是一个虚函数的指针. 没有虚函数的C++类,是不会…
1.多态性   指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作. C++支持两种多态性:编译时多态性,运行时多态性.    a.编译时多态性:通过重载函数实现 ,模板(2次编译)   b.运行时多态性:通过虚函数实现. 2.覆盖,隐藏,重载 重载,静态多态,一个类里面   覆盖, 虚函数 ,同参数,同名称,同返回   隐藏 : 1.1 基类非虚函数,子类与父类同名称(可能覆盖一大片父类函数) 1.2 基类非虚函数,派生类声明为virtual ,参数相同,此时virtual关键字…
虚函数表 对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的.简称为V-Table.在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承.覆盖的问题,保证其容真实反应实际的函数.这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数. 这里我们着重看一下这张虚函数表.C++的编译器应该是…
class A { public: virtual void vfunc1(); virtual void vfunc2(); void func1(); void func2(); virtual ~A(); private: int m_data1, m_data2; }; class B : A { public: virtual void vfunc1();; void func2(); virtual ~B(); private: int m_data3; }; class C : B…
一.虚函数的定义 被virtual关键字修饰的成员函数,目的是为了实现多态 ps: 关于多态[接口和实现分离,父类指针指向子类的实例,然后通过父类指针调用子类的成员函数,这样可以让父类指针拥有多种形态,所以称之为多态] 二.虚函数表 该表为一个类的虚函数的地址表,用于解决继承和覆盖的问题 1.拥有虚函数的类才有虚函数表 2.虚函数表属于类,然后类的所有对象通过虚函数表指针共享类的虚函数表 3.虚函数表的作用:当使用父类指针来操作子类对象时,虚函数表就像一个地图一样,指明了实际所应该调用的函数 4…
http://blog.csdn.net/hackbuteer1/article/details/7883531 转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531一.虚函数的工作原理      虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数.典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式.vptr…
 1.多态 面向对象程序设计中,多态性表现为: (1)重载多态:函数重载.运算符重载: (2)运行多态:通过基类的指针(或引用)调用不同派生类的同名函数,表现出不同的行为: (3)模板多态:参数多态,通过一个模板得到不同的函数或不同的类,具有不同的特性和不同的行为: 2.同名覆盖与重载 (1)override(同名覆盖) 在类的继承中才会出现,多个函数的原型是相同的. (2)overload(重载) 在同一作用域范围内,由参数个数或类型不同的多个同名函数构成. 3.虚函数 原因:通过指针调用成员…