virtual

C++虚函数实现

若如初见. 提交于 2020-03-07 03:08:51
虚函数出现的原因 C++多态通过虚函数来实现,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖,或者称为重写。 最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,动态绑定。由于编写代码时不能确定被调用的是基类还是哪个派生类的函数,所以被称为“虚函数”。如果没有使用虚函数的话,即没有利用C++的多态性,则利用基类指针调用相应的函数时,总被限制在基类函数本身,而无法调用到子类中被重写过的函数。 # include <iostream> using namespace std ; class A { public : void foo ( ) { printf ( "A::foo()1\n" ) ; } virtual void fun ( ) { printf ( "A::fun 2\n" ) ; } } ; class B : public A { public : void foo ( ) //隐藏:派生类的函数屏蔽了与其同名的基类函数 { printf ( "B::foo3\n" ) ; } void fun ( ) //多态、覆盖 { printf ( "B::fun4\n" ) ; } } ; int main ( void ) { A a ; B b ; A * p = & a ; p - > foo ( ) ; //输出1

也说new

↘锁芯ラ 提交于 2020-03-06 07:46:41
也说new 今天看到了Anytao的 [你必须知道的.NET] 第五回:深入浅出关键字---把new说透 。Anytao这一系列文章写得都非常好,其实甚至正是我一直想写的。比起各种应用层面上的技巧,我更喜欢研究.NET的底层机制。但是光顾了自己研究了,也没好好写东西给大家分享。 《把new说透》这篇文章介绍的内容不错,但Anytao文字上可能没有表达得很清晰。C# 2.0中关键字new有三种作用——1)作为修饰符覆盖父类中的virtual成员,2)作为运算符创建对象,3)作为泛型类型中对类型形参的约束。 new的这三种功能其实是完全不相干的,Anders Liu个人感觉作为文章来说,应该完全分开在不同的小节中去介绍。 1 new修饰符 new修饰符用于修饰类型成员(属性、方法等)。 (懒得画图写代码了,所以采用纯文字描述。大家可以看Anytao的代码) 当父类中编写了virtual方法时,子类出现了 相同签名 的方法时,必须冠以override或new运算符。 如果使用override运算符,则可以实现“多态”。即:将子类对象转成父类型后,调用virtual方法,实际上执行的是 子类 中的方法代码。 而如果使用new运算符,则不会出现上述情况,将子类对象转成父类型后,调用virtual方法,实际上执行的是还是 父类 中的方法代码。 2 new运算符 new运算符用于创建对象

虚函数和纯虚函数

﹥>﹥吖頭↗ 提交于 2020-03-03 11:56:43
class A { public: virtual void foo() { cout<<"A::foo() is called"<<endl; } }; class B:public A { public: void foo() { cout<<"B::foo() is called"<<endl; } }; int main(void) { A *a = new B(); a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的! return 0; }   上诉代码是虚函数的一个例子。其中B类继承A类,由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为"虚"函数。而虚函数只能借助于指针或者引用来达到多态的效果。 纯虚函数 一、定义: virtual void funtion1()=0   纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加"=0" 二、引入原因: 1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。 2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。   为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法

Apex クラスなど

久未见 提交于 2020-03-03 00:25:38
Apex では、最上位クラス (外部クラスとも呼ぶ クラス内に定義されているクラスである内部クラスの両方を定義できます 内部クラスの宣言にはアクセス修飾子を使用する必要はありません。 これが内部クラスのデフォルトアクセスです。つまり、内部クラスにア クセス修飾子を指定しない場合、private とみなされます。 global アクセス修飾子は、このクラスがすべての Apex コードで表示されることを宣言します。webservice キーワードで定義されているメソッドを含むすべてのクラスはglobal として宣言する必要があります。 with sharing およびwithout sharing の各キーワードはこのクラスの共有モードを指定します。 virtual 定義修飾子は、このクラスが拡張や上書きを許可することを宣言します。クラスがvirtual と して定義されていない場合、override キーワードを使用したメソッドの上書きはできません。 abstract 定義修飾子は、このクラスに抽象メソッド (署名のみが宣言され、本文が定義されていないメ ソッド) が含まれることを宣言します。 override を使用して上書きできるのは、virtual またはabstract として定義されたクラスの メソッドのみです。 プリミティブデータ型引数は値によってメソッド引数を渡す

初始JVM

a 夏天 提交于 2020-03-01 20:04:05
这几天面试,问了一些JVM的知识感觉答的不是很好,在此写JVM系列的文章(再次讨论的是java8的相关知识点),回顾一下相关知识,希望能够帮到看我文章的朋友,现在马上开始。 相关概念: 1.什么是jvm?(java virtual machine) Java虚拟机是抽象的计算机。像真正的计算机一样,它具有指令集并在运行时操作各种内存区域。 2.什么是运行时数据区? Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。其中一些数据区域是在Java虚拟机启动时创建的,仅在Java虚拟机退出时才被销毁。其他数据区域是每个线程的。创建线程时创建每个线程的数据区域,并在线程退出时销毁每个数据区域。 The Java Virtual Machine defines various run-time data areas that areused during execution of a program. Some of these data areas are created on Java Virtual Machine start-up and are destroyed only whenthe Java Virtual Machine exits. Other data areas are per thread.Per-thread data areas are

Virtual DOM 是React的精髓所在

三世轮回 提交于 2020-03-01 00:17:06
Virtual DOM 毫无疑问是 React 的精髓。 可能很多人包括我看完官方文档之后对Virtual DOM的理解就是: 它通过JS对象模拟原生DOM,加上DOM Diff 极大提升了DOM操作的性能。 这里的感觉就是这玩意最大的意义在于性能的提升。因为JS对象比DOM对象性能高。 如果这样理解其实完全忽略了 Virtual DOM 最精髓最颠覆性的意义:抽象。 Virtual DOM 最大的意义绝不是提升性能,而是他对DOM进行了一层抽象。当我们在浏览器中使用 React的时候,感觉不是特别明显,毕竟我们写的DOM标签跟原生的没什么区别,并且最终都被渲染成了DOM。 但是react native 的推出已经完全说明了 Virtual DOM 的颠覆性意义:它抽象了DOM的具体实现。 在浏览器中,Virtual DOM最终编译成了DOM,但是在 iOS中,Virtual DOM却完全可以编译成 oc 中的组件,甚至在安卓、windows、mac osx 中都完全可以编译成对应的UI组件。 在没有Virtual DOM之前,我们的代码中JS逻辑和UI是完全耦合的,不具有任何可移植性。 使用了Virtual DOM之后我们的代码编程这样了: 注意上图分为三个部分: 1,其中蓝色部分是JS业务逻辑,完全可以借助Node移植到任意平台上。 2,其中红色部分是 Virtual DOM

C++多态,虚函数,虚函数表,纯虚函数

旧巷老猫 提交于 2020-02-29 20:55:20
1、多态性 指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。 C++支持两种多态性:编译时多态性,运行时多态性。 a、编译时多态性:通过重载函数实现 ,模板(2次编译) b、运行时多态性:通过虚函数实现。 2、覆盖,隐藏,重载 重载,静态多态,一个类里面 覆盖, 虚函数 ,同参数,同名称,同返回 隐藏 : 1.1 基类非虚函数,子类与父类同名称(可能覆盖一大片父类函数)  1.2 基类非虚函数,派生类声明为virtual ,参数相同,此时virtual关键字失效 2.2 基类虚函数, 派生类不使用virtual, 形参不同,则丢失多态 2.3 基类和派生类都是 虚函数, 形参相同,返回值不同,报错 ////////////////////////// 多态典型应用,抽象工厂模式, /////////////////////////////////////////////////////////// 虚函数表,动态绑定如何实现? 多重继承,一个基类(含虚函数)会有一个虚表指针,继承后,自己的虚函数放在第一个虚表后面。 D:A,B,C; 强转D对象为A,B,C的时候,地址不一样 //////////////////////////////////// 构造函数与析构函数是否能定义为虚函数?能否抛出异常? 构造的时候必须要知道构造的东西结构吧,虚个鸡毛。。

c++虚函数和虚函数表

故事扮演 提交于 2020-02-28 09:55:14
前言 (1)虚基表与虚函数表是两个完全不同的概念 虚基表用来解决继承的二义性(虚基类可以解决)。 虚函数用来实现泛型编程,运行时多态。 (2)虚函数是在基类普通函数前加virtual关键字,是实现多态的基础 (3)虚函数表其实不用我们管这个编译器会帮我们做好 注:无特别说明本文的虚表均指虚函数表 (一) 什么是虚函数表? 虚函数(Virtual Function)是通过一张虚函数表(VirtualTable)来实现的。简称为V-Table。 虚表(virtual table),编译器为每个拥有虚函数的类都建有一张虚函数表,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数 。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重要了,它就像一个地图一样,指明了实际所应该调用的函数。 C++的编译器应该是保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证取到虚函数表的有最高的性能——如果有多层继承或是多重继承的情况下) (二)含虚函数的单继承 单继承时,派生类中仅有一个虚函数表。这个虚函数表和基类的虚函数表不是一个表(无论派生类有没有重写基类的虚函数),但是如果派生类没有重写基类的虚函数的话,基类和派生类的虚函数表指向的函数地址都是相同的。 #include

C#的New关键字的几种用法

五迷三道 提交于 2020-02-24 18:46:23
   一、在C#中,new这个关键字使用频率非常高,主要有3个功能: a) 作为运算符用来创建一个对象和调用构造函数。 b) 作为修饰符。 c) 用于在泛型声明中约束可能用作类型参数的参数的类型。 1.new 运算符 用于创建对象和调用构造函数。   1.用于创建对象和调用构造函数   例:People p=new People();   2.也用于为值类型调用默认的构造函数   例:int num= new int();   num初始化为 0,它是 int 类型的默认值。该语句的效果等同于:int myInt = 0;   3.不能重载 new 运算符。   4.如果 new 运算符分配内存失败,则它将引发 OutOfMemoryException 异常。 2.new 修饰符 用于向基类成员隐藏继承成员。   使用 new 修饰符显式隐藏从基类继承的成员。若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。在用作修饰符时,new关键字可以在派生类中隐藏基类的方法,也就说在使用派生类的方法是调用的方法是New关键字新定义出来的方法,而不是基类的方法。在不使用New关键字来隐藏基类方法也是可以的,编译器会出现一个警告,提示如果有意去隐藏基类的方法,请使用New关键字修饰。   这里有个注意事项就是New和Override这两个关键字是互斥的

RabbitMQ用户增删及权限控制

[亡魂溺海] 提交于 2020-02-23 17:53:53
RabbitMQ用户增删及权限控制 用户角色分类 none:无法登录控制台 不能访问 management plugin,通常就是普通的生产者和消费者。 management:普通管理者。 仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对policies进行管理。用户可以通过AMQP做的任何事外加: 列出自己可以通过AMQP登入的virtual hosts 查看自己的virtual hosts中的queues, exchanges 和 bindings 查看和关闭自己的channels 和 connections 查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动。 policymaker:策略制定者。 management可以做的任何事外加: 查看、创建和删除自己的virtual hosts所属的policies和parameters monitoring:监控者。 management可以做的任何事外加: 列出所有virtual hosts,包括他们不能登录的virtual hosts 查看其他用户的connections和channels 查看节点级别的数据如clustering和memory使用情况 查看真正的关于所有virtual hosts的全局的统计信息