C++ 中的virtual关键词】的更多相关文章

C++ 中的virtual关键词 动态绑定 所谓动态绑定,我的理解就是一个函数在调用之前无法得知参数的具体类型(基类还是派生类).C++ Primer上描述了两种动态绑定的情况: 要触发动态绑定,必须满足两个条件:一.指定为虚函数的成员函数.二.通过基类类型的引用或指针进行函数调用. 基类和派生类的关系 派生类是由基类派生而来,其包含基类的所有内容,并进行扩展和修改(覆盖).比如对基类Base和派生类Derived来说,我们可以说Derived就是Base类型的,也就是说在使用Base类型做形参…
1.绝不在构造和析构过程中调用virtual方法,为啥? 原因很简单,对于前者,这种情况下,子类专有成分还没有构造,对于后者,子类专有成分已经销毁,因此调用的并不是子类重写的方法,这不是程序员所期望的. 2.在构造方法和析构方法中,直接调用virtual方法,很容易识别.还有一种情况要注意,那就是间接调用.比如:构造方法调用init方法,而init方法调用virtual方法. 3.在构造过程中,不能使用virtual从上到下调用,哪有什么办法弥补呢? 可以将子类必要的信息向上传递给父类构造方法.…
在 C# 中,派生类可以包含与基类方法同名的方法. 基类方法必须定义为 virtual. 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作. 如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法. 如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法. 可以从派生类中使用 base 关键字调用基类方法. override.virtual 和…
在构造和析构执行期间不要调用virtual函数,因为这类调用从不会下降至derived class(比起当前执行构造函数和析构函数) 如果在base class 构造函数或者析构函数调用virtual,derived class构造时会先构造base class,则base class中的virtual实际调用是base class的; 第一种解释:derived class类先执行构造base class部分,然而在base class构造过程中,derived class部分是为初始化的,如…
笔者面临的问题如下: 笔者有一台Cisco C240的服务器, 其中有十块容量一样大的SAS的local disk, 一块SSD. 其中的两块SAS盘组成了一个RAID 1的virtual drive. 其他的九块SAS盘都做成了独立的virtual drive. 那么问题来了, 我们要在RAID 1的virtual drive上安装ESXi. 该怎么选? 下图中是ESXi的安装界面, 可以看到盘的大小都是837.26 GiB. 无法区分. 查看具体某一块盘的detail的时候, 可以看到更多的…
看过C++对象模型的话就可以知道,在构造基类时,完整的vtable没有建立起来(表项没有被相应的子类函数替换),因而无法调用到子类的函数(即构造函数中的virtual函数是本类里的方法,不是virtual的).书中也说即使调用了,因为构造函数的调用顺序,父类在构造时子类的成员还没有初始化可能,此时调用virtual函数无疑会造成混乱. 类似的关于析构过程,是一个子类先执行然后再父类执行的过程,如果在父类中调用virtual函数那么可能涉及到的子类数据已经被释放或者重置了,应该是出于这个考虑吧.…
文章目录 为什么要同步 Synchronized关键词 Synchronized Instance Methods Synchronized Static Methods Synchronized Blocks java并发中的Synchronized关键词 如果在多线程的环境中,我们经常会遇到资源竞争的情况,比如多个线程要去同时修改同一个共享变量,这时候,就需要对资源的访问方法进行一定的处理,保证同一时间只有一个线程访问. java提供了synchronized关键字,方便我们实现上述操作.…
来源:http://blog.csdn.net/jackiezhw/article/details/2673992 在 C# 中,派生类可以包含与基类方法同名的方法. 基类方法必须定义为 virtual. 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作. 如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法. 如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方…
作为一个并不勤快的程序猿,在项目开发过程中总是想尽办法少写代码,对var关键词的使用自然不会放过,几乎在每个能使用var的地方都用了var,对此,很多朋友同事给出了不同的建议,觉得能不使用var关键词就不用,主要理由有这么几点:使用var申明的变量类型并不明确,会降低程序的可读性并且增加了不确定性:为了保持代码风格的统一,减少var关键词的使用,跟以前的代码保持一致性. 这些理由当然不可否认其合理性,但是对我来说,我更在意使用var关键词能给我带来什么好处,是否真的能够达到偷懒的目的,总结了下使…
看下面的这段代码,问 print调用的是基类还是派生类的版本? 答案是 基类... 可能大家会很惊讶,print不是virtual function 吗?为什么不是调用派生类的版本呢? 首先,当定义一个派生类的对象的时候, 由于 base class 构造函数的执行更早于 derived class构造函数, 所以当 base class constructor 调用的时候,派生类的成员尚未初始化(说明,这个时候真正的 虚函数表尚未完全初始化). 如果这个时候调用 派生类的函数(可能使用未初始化…
在base class构造期间,virtual函数不是virtual函数. 构造函数.析构函数中不要调用virtual函数.…
今天看jcvm的标准的 时候,看到有一个virtual method,感觉很疑惑,以前看Java的时候并没有发现有这类方法. 百度.Google了一下,才发现,Java中普通方法就是virtual method,动态绑定是Java的默认行为. 如果不想让一个方法成为virtual method,只要把这个方法申明为final就可以了. 至于在c++中虚方法是怎么回事,可以参考下面这篇文章 http://www.cnblogs.com/xd502djj/archive/2010/09/22/183…
以下内容全部参考自:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html,有些直接复制了. 1. transient的作用 实体类实现了Serilizable接口,就可以被自动序列化,然后有些特殊字段如密码,金钱等不想被序列化就可以使用transient关键词来解决. transient修饰的是变量,不能修饰方法和类.静态变量不能被序列化,不能被序列化的意思的序列化进去和反序列化出来的值可能不是你想要的,而是jvm中当前的值. 具体的demo可以…
以下来自:http://www.cnblogs.com/codc-5117/archive/2011/12/04/2275298.html Static基本规则:             (1)一个类的静态方法只能访问静态属性.             (2)一个类的静态方法不能直接调用非静态方法.             (3)如果访问权限允许,static属性和方法可以使用对象加’.’方式调用,当然也可以使用实例加’.’方式调用.             (4)静态方法中不存在当前对象,所以…
#!/bin/bash while read line do for file in /home/local/test/* do if test -f $file then sed -n "/${line}/p" $file >> /home/local/out.txt fi done done < macid.txt 任务:要从home/local/test 文件夹下面的文件 file_1.log file_2.log .... 文件中把包含macid.txt文件的…
如下是一个股票交易的例子: class Transaction // 交易的基类 { public: Transaction(); ; // 用于记录交易日志 }; Transaction::Transaction() { logTransaction(); // 调用虚函数 } class BuyTransaction : public Transaction // 买进股票 { virtual void logTransaction() const; }; void BuyTransacti…
为了验证FPGA工程中的某个模块的功能和时序的正确性,常常需要对其单独进行验证,但是这些模块通常都与内部的众多信号相连(如系统总线,中断信号线等),往往一个模块的对外接口引脚会多达几百个,对其单独仿真的话,可能会对目标FPGA造成IO资源不足的情况.即使IO资源满足,当众多内部信号变成IO信号时,模块内部的信号将增加额外的IO延时,增加了时序约束的复杂度. 在编译时会出现类似错误: Error: Can't place 108 pins with 2.5 V I/O standard becau…
c++中的虚函数主要是用来实现多态的,虽然都同时指向父类的实例.但调用的确实子类的函数,这个有点像java的接口和实现的关系了.一个接口有多种实现,一个接口对象调用的是哪个实现的方法,这个就是多态了 这里我写了两个类,FClass作为父类,CClass作为子类,父类和子类中都有一个fun()函数.先看一下代码 FClass.h #include <iostream> using namespace std; #ifndef __FClass__ #define __FClass__ class…
很奇怪的设计,需要靠着两个Keyword共同作用,才能完成多态——而不是类似Java那样的默认多态.所谓共同作用,即基类使用virtual 标示函数,子类使用override显示重写. 有点奇怪,MSDN说了一大堆情境,但我仍然认为增加了多义性与复杂性. class MainClass     {         public static void Main (string[] args)         {                      var s1 = new Student …
获取虚拟机镜像 PS C:\WINDOWS\system32> Get-AzureVMImage 仅获得虚拟机名 PS C:\WINDOWS\system32> (Get-AzureVMImage).ImageName 0c5c79005aae478e8883bf950a861ce0__Windows-Server-2012-Essentials-20131018-enus 0c5c79005aae478e8883bf950a861ce0__Windows-Server-2012-Essent…
1.选择安卓原生镜像的问题 选择带PC的字眼的,也就是给平板PC使用的那个,我使用的版本是android-x86-4.0-r1-eeepc.iso其他类似版本也是可以的,因为我已经成功实践啦. 下载地址:http://www.android-x86.org/download 2.进入安卓系统鼠标找不到的问题,怎么处理 选择禁止独占指标,这样就会在安卓系统中出现鼠标的框架,(一开始我还以为安装有问题呢) 3.安装软件,出现的不能横屏问题,比如安智,还有微信等等 必须强制让它们转化为横屏,这个地方是…
#@date: 2014-06-14 #@author: gerui #@email: forgerui@gmail.com Contents extern的作用一般是用来声音一个外部变量和函数.一般在头文件hello.h中进行extern int a;的声明,在hello.c中进行a = 10;的定义. 如果在hello.h中既声明又定义,则会引起一个问题.如,hello.h中定义一个extern int a =2;,hello1.c中#include "hello.h",hello…
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { father _father = new son1(); _father.printclassname(); son _son = new son1(); _son…
(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 为方便采用书上的例子,先提出问题,在说解决方案. 1 问题 1: class Transaction{ 2: public: 3: Transaction(); 4: virtual void LogTransaction() const = 0 ; 5: ... 6: }; 7:  8: Transaction::Transaction() //Base cl…
Java中的Runable,Callable,Future,FutureTask,ExecutorService,Excetor,Excutors,ThreadPoolExcetor在这里对这些关键词,以及它们的用法做一个总结. 首先将它们分个类: Runable,Callable Future,FutureTask ExecutorService,Excetor,Excutors,ThreadPoolExcetor 1. 关于Ranable和Callable 首先Java中创建线程的方法有三种…
新建一个Java Project :LuceneTest 准备lucene的jar包,要加入的jar包至少有: 1)lucene-core-3.1.0.jar     (核心包) 2) lucene-analyzers-3.1.0.jar    (分词器) 3) lucene-highlighter-3.1.0.jar    (高亮器) 4) lucene-memory-3.1.0.jar       (高亮器) 新建实体类:Article, 属性:id,title,content; gette…
我们经常听到建议要把构造函数不能为虚,析构函数最好为虚,这是为什么? 如下例子: // pvtable1.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include <iostream> using namespace std; class Base1 { public: Base1(){ cout << "Base1::Base1()" << endl; } ~Base1(){ cout…
1.如果父类方法没有加virtual关键字,即不是一个虚方法,则在子类中只能隐藏基类方法,而不能覆盖. 2.如果父类方法加了virtual关键字,即它是一个虚方法,在子类中一样可以隐藏. 3.如果子类实现了父类相同的方法(相同的方法名称及签名),而没有new,在编译时会报警,但编译仍然能够通过! 4.调用父类方法:base.方法名() 5.abstract类是一个抽象类,不能被实例化 new 和override的区别 1.override重写虚方法,那么就只剩下重写以后的方法; 2.new隐藏基…
使用virtual:如果方法是通过引用类型或指针而不是对象调用的,它将确定使用哪一种方法.如果没有使用关键字irtual,程序将根据引用类型或指针类型选择方法:如果使用了irtual,程序将根据引用或指针指向的对象的类型来选择方法.对于一个函数ViewAcct()来说,如果ViewAcct()不是虚的,则程序的行为如下:// behavior with non-virtual ViewAcct()// method chosen according to reference typeBrass…
C语言 auto被解释为一个自动存储变量的关键字,也就是申明一块临时的变量内存. 例如: auto double a=3.7; 表示a为一个自动存储的临时变量. C++语言 C++ 98标准/C++03标准 同C语言的意思完全一样:auto被解释为一个自动存储变量的关键字,也就是申明一块临时的变量内存. C++ 11标准 在C++11标准的语法中,auto被定义为自动推断变量的类型.例如: auto x=5.2;//这里的x被auto推断为double类型   map<int,int>m; f…