[00000]-[2015-06-22]-[00]-[C++ 虚函数]

C++语言的多态性 与 C++类的虚函数有关

引入一个问题:定义一个基类指针,指向派生类对象,然后根据指针调用相应的方法,会有什么效果?

class CBase

{

public:

  virtual void vfun()

  {

    cout<<"vfun from base class"<<endl;

  }

  void fun()

  {

    cout<<"fun from base class"<<endl;

  }

};

class CDerive : public CBase

{

public:

  virtual void vfun()

  {

    cout<<"vfun from derive class"<<endl;

  }

  void fun()

  {

    cout<<"fun from derive class"<<endl;

  }

};

CBase* pBase;

CBase base;

CDerive derive;

【1】若 pBase = &derive;

    pBase->vfun();

    pBase->fun();

   // 输出结果

    vfun from derive class

    fun from derive class

   // 虚函数在派生类中得到重载 且 指针指向派生类对象

【2】若 pBase只是定义,但是没有进行初始化;

    pBase->vfun();

    pBase->fun();

   // 会输出Base class 中的相应函数处理结果

   // 若要基类指针调用派生类的函数方法,要么让pBase指向派生类对象,要么对pBase进行类型显示强制转换(CDerive*)pBase;

    (CDerive*)pBase->vfun();

    (CDerive*)pBase->fun();

对于每一个内部含有虚函数的类,编译器都会为其生成一个虚函数表(vtable),表中的每个元素都指向一个虚函数的地址,编译器还会生成一个成员变量-----虚函数表指针(vptr)指向虚函数表,这个会被继承的。。。。。

时间: 2024-10-20 20:34:42

[00000]-[2015-06-22]-[00]-[C++ 虚函数]的相关文章

从实用主义深入理解c++虚函数

记得几个月前看过C++虚函数的问题,当时其实就看懂了,最近笔试中遇到了虚函数竟然不太确定,所以还是理解的不深刻,所以想通过这篇文章来巩固下. 装逼一刻: 最近,本人思想发生了巨大的转变,在大学的时候由于读书少,经常写一些玩具程序而沾沾自喜,总之一句话,那时写程序纯粹是为了写程序而写程序.然而,作为大部分的学习者来说,往往忽略了学习开发语言的本质.即C++语言的设计思想也是以服务生产生活为主的,总结成一句话就是C++是实用的.我们在学习这门语言的一些特性的时候,上来就开始直接去记忆或者揣摩这些特性

[转载]C++虚函数浅析

原文:http://glgjing.github.io/blog/2015/01/03/c-plus-plus-xu-han-shu-qian-xi/ 感谢:单刀土豆 C++虚函数浅析 JAN 3RD, 2015 1:59 AM | COMMENTS 一 引言 C++面向对象语言的一大特性就是抽象,在程序设计上的体现就是鼓励面向接口编程,而不要面向具体实现编程.这里所说的抽象和接口与C++的多态性密切相关.C++的多态分为静态多态(编译时多态)和动态多态(运行时多态)两大类.静态多态通过重载.模

C++ 虚函数内存分配

本文重点参考了<C++ 虚函数表解析>一文(链接:http://blog.csdn.net/haoel/article/details/1948051/),陈皓前辈此文讲解清晰,读后受益匪浅.只是代码中存在一些问题,例如涉及到本文重点虚函数表的地方,写到 Base b; cout << "虚函数表地址:" << (int*)(&b) << endl; 但是,实际上(int*)(&b)并非虚函数表地址,而是对象b的地址,*(

C++手稿:虚函数与多态

C++类继承带来了诸多好处:基类代码复用.通用的方法和属性.更好的可维护性, 然而最大的好处莫过于提供统一的接口.接口是一种对类型的抽象,它统一了一系列类的行为, 不同类的对象之间交互更加容易.Java.objective C等面向对象语言都提供了接口的概念, 在C++中,可以通过抽象类来实现一个接口. C++通过虚函数实现了多态:通过基类指针或引用调用虚函数时,会调用当前对象的实际类型中声明的函数. 为了这个特性,包含虚函数的C++对象中会存储一个虚函数表指针,来完成动态联编. 编译程序在编译

C++中的out-of-line虚函数

引子 在现实编码过程中,曾经遇到过这样的问题“warning:’Base’ has no out-of-line method definition; its vtable will be emitted in every translation unit”.由于对这个warning感兴趣,于是搜集了相关资料来解释这个warning相关的含义. C++虚表内部架构    Vague Linkage    out-of-line virtual method C++虚表内部架构 在C++实现机制R

C++中virtual(虚函数)的用法

转载:http://blog.csdn.net/foreverhuylee/article/details/34107615 在面向对象的C++语言中,虚函数(virtual function)是一个非常重要的概念. 什么是虚函数: 虚函数是指一个类中你希望重载的成员函数 ,当你用一个  基类指针或引用   指向一个继承类对象的时候,调用一个虚函数时, 实际调用的是继承类的版本. --摘自MSDN                                                 

c++ 虚函数详解

下面是对C++的虚函数的理解. 一,定义 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离:用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略.下面来看一段简单的代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 classA { publi

第八章:不要在构造和析构函数中使用虚函数

前言 本文将讲解一个新手C++程序员经常会犯的错误 - 在构造/析构函数中使用虚函数,并分析错误原因所在以及规避方法. 错误起因 首先,假设我们以一个实现交易的类为父类,然后一个实现买的类,一个实现卖的类为其子类. 这三个类的对象初始化过程中,都需要完成注册的这么一件事情 (函数).然而,各自注册的具体行为是不同的. 有些人会写出以下这样的代码: 1 class Transaction { 2 public: 3 Transaction(); // 父类构造函数 4 //...... 5 pri

为什么构造函数不能声明为虚函数,析构函数可以

构造函数不能声明为虚函数,析构函数可以声明为虚函数,而且有时是必须声明为虚函数.不建议在构造函数和析构函数里面调用虚函数. 构造函数不能声明为虚函数的原因是:1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的.而在构造一个对象时,由于对象还未构造成功.编译器无法知道对象 的实际类型,是该类本身,还是该类的一个派生类,或是更深层次的派生类.无法确定... 2 虚函数的执行依赖于虚函数表.而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数