虚函数调用机制

#include <iostream>
class Animal
{
public:
    Animal(){};
    virtual ~Animal(){};
    virtual void Eat()
    {
        std::cout << "Animal Eat" << std::endl;
    }
};

class Bird : public Animal
{
public:
    Bird(){};
    void Eat()
    {
        std::cout << "Bird Eat" << std::endl;
    }
};

int main()
{
    /*
    上次看对象模型,对于多态到底怎么调的不是太清楚,今天又翻开
    在编译的时候每个类的vpt就能确定,以及其中的slot对于的虚函数地址能确定
    如Animal:
    0 -- typeinfo
    1 -- ~Animal
    2 -- Eat
    对于Bird
    0 -- typeinfo
    1 -- ~Bird(搞不太懂为什么是这个也是虚函数)
    2 -- Eat()
    */
    Animal* pAnimal = new Bird;
    /*
    每个类有一个vpt,其中的虚函数的slot的值在编译时就固定了,按c++对象模型Eat这个位置固定为2
    所有运行时根据pAnimal执行的类型调用相应的table的2这个位置的函数地址指向的函数即可,这个就是运行时多态
    根据实际类型查询不同的表即可
    */
    pAnimal->Eat();
    getchar();
    return 0;
}
时间: 2024-07-30 10:21:20

虚函数调用机制的相关文章

匹夫细说C#:从园友留言到动手实现C#虚函数机制

前言 上一篇文章匹夫通过CIL代码简析了一下C#函数调用的话题.虽然点击进来的童鞋并不如匹夫预料的那么多,但也还是有一些挺有质量的来自园友的回复.这不,就有一个园友提出了这样一个代码,这段代码如果被编译成CIL代码的话,对虚函数的调用会使用call而非callvirt: override string ToString() { return Base.ToString(); } 至于为何是这样,匹夫在回复中也做了解释,因为上面那段代码其实相当于是这样的: override string ToSt

(转载)你好,C++(25)函数调用和它背后的故事5.1.2 函数调用机制

你好,C++(25)函数调用和它背后的故事5.1.2 函数调用机制 5.1.2  函数调用机制 在前面的学习中,我们多次提到了“调用函数”的概念.所谓调用函数,就是将程序的执行控制权从调用者(某个函数)交给被调用的函数,同时通过参数向被调用的函数传递数据,然后程序进入被调用函数内部,执行函数定义中的代码获得结果数据,函数体代码执行完毕后再将控制权交回给调用者同时将结果数据通过返回值传递给调用者,作为整个函数调用表达式的值.简而言之,调用函数也就是执行函数中的代码,完成函数的功能. 在学习如何编写

C函数调用机制及栈帧指针

转载: http://bbs.csdn.net/topics/90317145 http://blog.chinaunix.net/uid-26817832-id-3347227.html 帧指针 和栈指针到底是什么,有什么联系吗 FP帧指针指向帧头 SP栈指针指向栈顶 大部分现代计算机系统使用栈来给进程传递参数并且存储局部变量.栈是一种在进程映象内存的高地址内的后进先出(LIFO)的缓冲区.当程序调用一个函数时 一个新的"栈帧"会被创建.这个栈帧包含着传递给函数的各种参数和一些动态的

C++ - 继承虚函数调用 代码

继承虚函数调用 代码 本文地址: http://blog.csdn.net/caroline_wendy 派生类继承基类时, 使用virtual时, 会进行动态绑定, 没有virtual关键字则会覆盖. 使用基类指针(Base*)指向派生类时, 调用函数, 则动态绑定的函数会调用派生类, 非动态绑定的函数调用基类. 代码: /* * main.cpp * * Created on: 2014.9.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #

[C/C++] 虚函数机制

转自:c++ 虚函数的实现机制:笔记 1.c++实现多态的方法 其实很多人都知道,虚函数在c++中的实现机制就是用虚表和虚指针,但是具体是怎样的呢?从more effecive c++其中一篇文章里面可以知道:是每个类用了一个虚表,每个类的对象用了一个虚指针.具体的用法如下: class A { public: virtual void f(); virtual void g(); private: int a }; class B : public A { public: void g();

函数调用机制

http://blog.csdn.net/jjiss318/article/details/7185802 在Linux内核程序boot/head.s执行完基本初始化操作之后,就会跳转去执行init/main.c程序.那么head.s程序是如何把执行控制转交给init/main.c程序的呢?即汇编程序是如何调用执行C语言程序的?这里我们首先描述一下C函数的调用机制.控制权传递方式,然后说明head.s程序跳转到C程序的方法. 函数调用操作包括从一块代码到另一块代码之间的双向数据传递和执行控制转移

从园友留言到动手实现C#虚函数机制

上一篇文章匹夫通过CIL代码简析了一下C#函数调用的话题.虽然点击进来的童鞋并不如匹夫预料的那么多,但也还是有一些挺有质量的来自园友的回复.这不,就有一个园友提出了这样一个代码,这段代码如果被编译成CIL代码的话,对虚函数的调用会使用call而非callvirt: override string ToString() { return Base.ToString(); } 至于为何是这样,匹夫在回复中也做了解释,因为上面那段代码其实相当于是这样的: http://paradise.ezla.co

虚函数调用(2)(转载)

如果父类虚函数没有被覆盖,则这个虚函数是完全没有意义的. 如有以下两个类的继承情况: class Base{ public: virtual void f(){ cout<<"Base::f()" <<endl; } virtual void g(){ cout<<"Base::g()" <<endl; } virtual void h(){ cout<<"Base::h()" <

C++ 虚函数机制学习

致谢 本文是基于对<Inside the c++ object model>的阅读和gdb的使用而完成的.在此感谢Lippman对cfront中对象模型的解析,这些解析帮助读者拨开迷雾.此外,Linux下无比强大的gdb工具更是驱散"黑暗"的"明灯".  :) No-Inheritance 1 class Base { 2 public: 3 int a = 21; 4 static int b; 5 int c = 22; 6 7 void showB