c++虚函数[转]】的更多相关文章

C++ 虚函数表解析 陈皓 http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制.关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数.这种技术可以让父类的指针有“多种形态”,这是一种泛型技术.所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法.比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议. 关于虚函数的使用方法,我在这里不做过多的阐述.大家可以…
Java基础 之软引用.弱引用.虚引用 ·[转载] 2011-11-24 14:43:41 Java基础 之软引用.弱引用.虚引用 浏览(509)|评论(1)   交流分类:Java|笔记分类: Java 1.概述 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及状态,程序才能使用它.这 就像在日常生活中,从商店购买了某样物品后,如果有用,就一直保留它,否则就把它扔到垃圾箱,由清洁工人收走.一般说来,如果物品已经被扔到垃圾箱,想再…
C++中虚拟继承的概念 为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类.这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射.这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题.class 派生类名:virtual 继承方式  基类名virtual是关键字,声明该基类为派生类的虚基类.在多继承情况下,虚基类关键字的作用范围和继承方式关键字相同,只对紧跟其后的基类起作用.声明了虚基类之后,虚基…
1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较.这一篇文章,我准备为大家介绍一下奇葩的Objective-C语言的语法和使用.这篇文章主要讲Objective-C的理论概念. 2.学习目标 2.1 Objective-C语言面向对象的特性 与C++类比学习,声明定义一个MyObject类,并创建这个类的实例. 2.2 Objective-C语言…
[Swift]基础 一, 常用变量 var str = "Hello, playground" //变量 let str1="Hello xmj112288" //常量 // 多变量, 注意 ; 和 , 的区别 var int1:Int32; var str2:String; var int2:Int32, str3:String var f1:Float=0.1,d1:Double=2.1,s1:String="s1"; // 显示定义类型 v…
1. 什么是internationalization(i18n)? 国际化,英文简称i18n,按照维基百科的定义:国际化是指在设计软件,将软件与特定语言及地区脱钩的过程.当软件被移植到不同的语言及地区时,软件本身不用做内部工程上的改变或修正. 当然,官方的定义总是十分高大上.实际上,今天我们要做的并没有那么复杂.任务是为上次的系列3里的Web站点提供多语言支持.比如上次是英语网站,这次我们可以根据用户地点自动提供中文网站或其他语言网站. 2.如何实现i18n? 2.1 Step1: 登录Clou…
Description 已知两个正整数a和b,求在a与b之间(包含a和b)的所有整数的十进制表示中1出现的次数. Input 多组数据(不超过100000组),每组数据2个整数a,b.(1≤a,b≤1000000). Output 每组数据的答案占一行. Sample Input 1 10 10 100 2 1 Sample Output 2 20 1 题目大意:给出两个数,求这两个数之间的十进制数中1出现的个数. //看完不会,如果是二进制数出现的个数那就简单了. 前缀和问题: https:/…
要实现的部分为:forward prop, softmax函数的cost function,每一层的gradient,以及penalty cost和gradient. forwad prop forward prop是输入sample data,使sample data通过神经网络后得到神经网络输出的过程. 以分类问题来说,不同层的输入和输出如下表所示: 层 输入 输出 输入层 sample data feature map 隐藏层 feature map feature map 输出层 fea…
    地址.http://blog.csdn.net/xhmj12/article/details/54730883 相关阅读: 吊炸天!74款APP完整源码! [干货精品,值得收藏]超全的一线互联网公司内部面试题库,有了它,妈妈再也不用担心我进不了大公司了! [干货,阅后进BAT不是梦]面试心得与总结---BAT.网易.蘑菇街 [精品干货]面试题库第二波:java面试一定会遇到的56个面试题 [面经福利]如何进入百度.阿里,一个6年Android老司机的面经 2016年百度校招小结:我做技术…
C++虚函数和函数指针一起使用,写起来有点麻烦. 下面贴出一份示例代码,可作参考.(需要支持C++11编译) #include <stdio.h> #include <list> using namespace std; class VirtualWithCallBack { public: using CallBack = void(VirtualWithCallBack::*)(int); public: ; ; }; class VirtualWithCallBackSamp…
前言 上一篇文章匹夫通过CIL代码简析了一下C#函数调用的话题.虽然点击进来的童鞋并不如匹夫预料的那么多,但也还是有一些挺有质量的来自园友的回复.这不,就有一个园友提出了这样一个代码,这段代码如果被编译成CIL代码的话,对虚函数的调用会使用call而非callvirt: override string ToString() { return Base.ToString(); } 至于为何是这样,匹夫在回复中也做了解释,因为如果CIL使用callvirt指令,那么上面那段代码其实相当于是这样的:…
多态性就是同一符号或名字在不同情况下具有不同解释的现象.多态性有两种表现形式: 编译时多态性:同一对象收到相同的消息却产生不同的函数调用,一般通过函数重载来实现,在编译时就实现了绑定,属于静态绑定. 运行时多态性:不同对象在收到相同消息时产生不同的动作,一般通过虚函数来实现,只有在运行时才能实现绑定,属于动态绑定. 虚函数 虚函数是在基类中用关键字virtual 标识的成员函数,可以在一个或多个派生类中被重新定义.如果一个函数被定义为虚函数,那么,即使是使用指向基类对象的指针来调用该成员函数,也…
为了访问公有派生类的特定成员,可以通过讲基类指针显示转换为派生类指针. 也可以将基类的非静态成员函数定义为虚函数(在函数前加上virtual) #include<iostream> using namespace std; class base{ public: /*virtual*/ void who(){ //define this function to virtual will be normal cout << "this is the class of bas…
Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. --------------------------------------------------------------------------------------- 转载自:http://blog.csdn.net/hackbuteer1/article/details/7558868 首先:…
9.不在构造.析构函数中调用虚函数 1.在构造函数和析构函数中调用虚函数会产生什么结果呢? #; } 上述程序会产生什么样的输出呢? 你一定会以为会输出: cls2 make cls2 delete 或者是: cls2 make cls2 make cls2 delete cls2 delete (如果你想到了后一种,说明你对派生类的构造有一定了解) 因为在构造和析构函数使用了虚函数,应该是迟绑定.但是实际的输出是: cls1 make cls2 make cls2 delete cls1 de…
在构造函数中调用虚函数,并不会产生多态的效果,就跟普通函数一样. c++ primer 第四版中497页15.4.5构造函数和析构中的虚函数讲到,如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数自身类型定义的版本.另外,必须通过基类类型的引用或指针进行函数调用才会发生多态. 相关帖子:http://bbs.csdn.net/topics/390537893 //示例1 #include <iostream> using namespace std; class A { pr…
接口只能声明不能实现,虚函数可以. 接口:对外提供可以访问的函数叫接口.虚函数不需要被强制重写,其本身含有实现部分. 抽象类:指派了派生类必须实现的函数(纯虚函数),不然编译不通过. 虚函数的限制:    1.虚函数仅适用于有继承关系的类对象,   所以只有类的成员函数才能说明为虚函数.      2.静态成员函数不能是虚函数.      3.内联函数不能是虚函数.      4构造函数不能是虚函数.      5.析构函数可以是虚函数. 接口可以有静态成员.嵌套类型.抽象.虚拟成员.属性和事件…
class A { public: virtual void f();//希望派生类重写 void fun();//绝大多数情况下不要重新定义基类的非虚函数,那样会打破公有继承Is-A的关系,而且行为诡异 }; class B : public A { }; int main() { A a; ; }…
  首先,来看一个简单的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.并且在…
在你设计一个基类的时候,如果发现一个函数需要在派生类里有不同的表现,那么它就应该是虚的.从设计的角度讲,出现在基类中的虚函数是接口,出现在派生类中的虚函数是接口的具体实现.通过这样的方法,就可以将对象的行为抽象化. 1.虚函数(impure virtual),C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现. 子类可以重写父类的虚函数实现子类的特殊化. 2.纯虚函数(pure virtual),C++中包含纯虚函数的类,被称为是“抽象类”.抽象类不能使用n…
C++中和虚函数(Virtual Function)密切相关的概念是"动态绑定"(Dynamic Binding),与之相对的概念是"静态绑定"(Static Binding).所谓"静态绑定",是指在编译时就能确定函数调用语句和实际执行的函数:而"动态绑定"则是--对于同一个函数调用,编译时并不能确定具体调用的函数,直到执行时才能决定. 静态绑定 继承而没有体现多态的例子: #include <iostream>…
构造函数不可以是虚函数的,这个很显然,毕竟虚函数都对应一个虚函数表,虚函数表是存在对象内存空间的,如果构造函数是虚的,就需要一个虚函数表来调用,但是类还没实例化没有内存空间就没有虚函数表,这根本就是个死循环. 可是析构函数却要定义成虚函数,这是为什么呢,写一个非常简单的例子来理解一下: class AA { public: AA() {}; ~AA() { fun2(); }; virtual void fun1() { cout << "Base construct" &…
关于类不断被继承的过程,从整体上看,是一个从抽象到逐渐具体化的过程,基类可以是非常非常抽象的东西,而最终实例化的派生类就非常具体了. 虚函数的意义,就在于定义了一个从最早的基类到最终的派生类都可能会用到(根据需求可以选择重新实现还是不重新实现,但纯虚函数必须实现,关于原因,我已经在其他文章说过)的一个功能. 在这个派生类不断继承基类的过程中,这个功能会根据派生类的需求不断地变化.我们在调用不同派生类的虚函数的时候,可以拥有不同的功能.然后有人说,这么麻烦,还不如每个派生类都自己重命名一个函数就行…
虚函数为了重载和多态的需要,在基类中是由定义的,即便定义是空,所以子类中可以重写也可以不写基类中的函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数. class Cman { public: virtual void Eat(){……}; void Move(); private: }; class CChild : public CMan { public: virtual void…
1.非virtual函数,调用规则取决于对象的显式类型.例如 A* a  = new B(); a->display(); 调用的就是A类中定义的display().和对象本体是B无关系. 2.virtual函数,具体调用哪个版本,取决于虚函数表.例如 A* a = new B(); a->v_display(); 这个时候,对象a就需要查找自身的虚函数表,表中的v_display()是一个函数指针,可能指向不同类中的对应的v_display函数并调用对应版本的v_display.一般而言,如…
首先看一段代码: class B { public: ) { std::cout << "base fun called, " << i; }; }; class D : public B { private: ) { std::cout << "driver fun called, " << i; }; }; 如果进行如下操作: B* p = new D();    p->fun();    会输出 drive…
干货较多-需要自己深思理解: C++支持两种多态性: 1.编译时多态性(静态绑定-早绑定) 在程序编译阶段即可以确定下来的多态性 通过使用 重载机制(重载函数)实现 (模板)http://blog.csdn.net/my_business/article/details/12194691 2.运行时多态性(动态绑定-晚绑定) 必须等到程序运行时才能确定的多态性 要通过 虚函数 来实现 http://blog.csdn.net/zp752963831/article/details/4663588…
前导 在上面的博文中描述了基类中存在虚函数时,基类和派生类中虚函数表的结构. 在派生类也定义了虚函数时,函数表又是怎样的结构呢? 先看下面的示例代码: #include <iostream> using namespace std; class A { public: virtual void funcA(){ cout<<"A"<<endl; } }; class B { public: virtual void funcB(){ cout<…
创建一个含有虚函数的对象时, 编译器会实现 "初始化其VPTR以指向相应的VTABLE" 这个操作 ,而实现这个操作是通过 "插入隐藏代码至构造函数中" 故此时大量的内联构造函数会使代码长度增加导致效率下降 有时这足以抵消内联函数带来的调用代价的减小(实际上经常这样 一个推荐的做法是去掉这些内联构造函数…
本文不讨论虚函数的原理,只简单总结下虚函数的常用事项. 虚函数(虚方法)是C++动态联编 实现多态的重要手段,在函数声明时使用关键字virtual即可,如: virtual void func(void); 注意:虚函数(虚方法)只针对类的成员函数,普通函数不可声明为虚函数!且一般只有在用到继承时才将基类的成员函数声明为虚函数! 请看如下代码: class parentClass { public: parentClass(); ~parentClass(); void func_1(void)…