virtual

对.Net Framework的认识(2)

主宰稳场 提交于 2020-03-27 08:40:45
类和接口的访问权限默认是internal,接口成员不能添加访问修饰符,默认是public,类成员默认是private的。 C#中静态类不能实现接口,它里面所有的成员(包括成员类型,方法等)必须是静态的。 CLR不支持partial,那只是C#的语法,所以partial class必须用C#写。 virtual和override,前者用于父类标识可重构的成员,后者用于子类的重构,virtual方法最好少用,因为性能会降低。因为非virtual方法,CLR可以很快定位到这个方法的出处,而virtual方法,CLR得先去找调用该方法的对象是哪个类型的,在确定类型之后才能定位方法的出处,如果派生层次很多很复杂的话,性能消耗就会比较大。 sealed标识密封类,即不可继承类,不能同时使用virtual关键字,类申明成sealed可以提高性能,因为可以减少很多检查和验证。 new除了实例化对象外,当子类的方法签名和父类一样时,用new可以更清楚地表达子类的方法和父类没有任何关系,如果不用的话,编译时会警告,但还是会隐藏父类方法,使用子类自己定义的方法。 常量的值必须在编译时就确定,编译后,CLR会把常量的值保存在程序集的元数据中,如果代码中使用到常量,CLR会去元数据中查找并把常量值放入IL中。常量如果为引用类型(String除外),则只能赋值null。类中的常量字段引用方式和静态字段一样

.net core webapi Controller中处理http请求和响应

时光怂恿深爱的人放手 提交于 2020-03-23 18:18:01
在实际工作中,企业框架往往对Http请求和响应的body制定了一定的规范,这样每次编写Controller中Action方法时,有以下两个问题要解决: 都要解析请求报文以获取有用的参数 在返回时,根据规范去包装响应内容 为了减少工作量,我们可以编写一段通用的代码,在请求的时候对请求body进行解析,在响应的时候对body进行包装。 我这里采用的方式是在自己写Controller类上加一个自定义的特性[HttpMessageAttribute],这个特性继承自[ActionFilterAttribute],[ActionFilterAttribute]特性有以下几个常用的虚方法: #region 程序集 Microsoft.AspNetCore.Mvc.Core, Version=3.1.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 #endregion //在Action执行之后调用 public virtual void OnActionExecuted(ActionExecutedContext context) { } //在Action执行之前调用 public virtual void OnActionExecuting(ActionExecutingContext context) { } /

C#修饰符

吃可爱长大的小学妹 提交于 2020-03-23 12:00:18
修饰符用于限定类型以及类型成员的申明,c#中有13种修饰符,按功能可分为三部分:存取修饰符,类修饰符和成员修饰符. 存取修饰符: public:存取访问不受限制. private:只有包含该成员的类可以存取.当前类才能访问 internal:只有当前工程可以存取.只限于类所在的命名空间(不包括子类) protected:只有包含该成员的类以及继承的类可以存取. partial关键字: 类修饰符: abstract:抽象类,可以被指示一个类只能作为其它类的基类.必须被继承和重写的 sealed:密封类,指示一个类不能被继承.防止该类被其它类继承 成员修饰符:可以将类、结构或接口的定义拆分到两个或多个源文件中。每个源文件包含类定义的一部分,编译应用程序时将把所有部分组合起来 abstract:指示该方法或属性没有实现.只能在抽象类中声明 const:指定域或局部变量的值不能被改动. event:声明一个事件. extern:指示方法在外部实现. override:对由基类继承成员的新实现. readonly:指示一个域只能在声明时以及相同类的内部被赋值. static:指示一个成员属于类型本身,而不是属于特定的对象. virtual:指示一个方法或存取器的实现可以在继承类中被覆盖. 静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数

C#队列学习笔记:队列(Queue)和堆栈(Stack)

可紊 提交于 2020-03-23 01:57:58
一、队列(Queue) 1.1、概念 队列(Queue)代表了一个 先进先出 的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为 入队 ,当您从列表中移除一项时,称为 出队 。 1.2、Queue类的属性 下表列出了Queue类的一些常用的属性: 属性 描述 Count 获取 Queue 中包含的元素个数。 1.3、Queue类的方法 下表列出了Queue类的一些常用的方法: 序号 方法名 & 描述 1 public virtual void Clear(); 从 Queue 中移除所有的元素。 2 public virtual bool Contains( object obj ); 判断某个元素是否在 Queue 中。 3 public virtual object Dequeue(); 移除并返回在 Queue 的开头的对象。 4 public virtual void Enqueue( object obj ); 向 Queue 的末尾添加一个对象。 5 public virtual object[] ToArray(); 复制 Queue 到一个新的数组中。 6 public virtual void TrimToSize(); 设置容量为 Queue 中元素的实际个数。 1.4、示例演示 class Program { static

C++ Virtual 完美诠释

半腔热情 提交于 2020-03-22 18:03:43
解答了我的一些疑问,觉得写的不错!!!转载一下。 virtual在英文中表示“虚”、“虚拟”的含义。c++中的关键字“virtual”主要用在两个方面:虚函数与虚基类。下面将分别从这两个方面对virtual进行介绍。 1.虚函数 虚函数源于c++中的类继承,是多态的一种。在c++中,一个基类的指针或者引用可以指向或者引用派生类的对象。同时,派生类可以重写基类中的成员函数。这里“重写”的要求是函数的特征标(包括参数的数目、类型和顺序)以及返回值都必须与基类中的函数一致。如下所示: 可以在基类中将被重写的成员函数设置为虚函数,其含义是:当通过基类的指针或者引用调用该成员函数时,将根据指针指向的对象类型确定调用的函数,而非指针的类型。如下,是未将test()函数设置为虚函数前的执行结果: 在将test()函数设置为virtual后,执行结果如下: 如此,便可以将基类与派生类的同名方法区分开,实现多态。 说明: 1.只需将基类中的成员函数声明为虚函数即可,派生类中重写的virtual函数自动成为虚函数; 2.基类中的析构函数必须为虚函数,否则会出现对象释放错误。以上例说明,如果不将基类的析构函数声明为virtual,那么在调用delete p2;语句时将调用基类的析构函数,而不是应当调用的派生类的析构函数,从而出现对象释放错误的问题。 3.虚函数的使用将导致类对象占用更大的内存空间

C++的多态性

南楼画角 提交于 2020-03-21 06:53:17
1.静态多态 (1)函数重载 (2)操作符重载 2.动态多态 继承,虚函数 实现机制: 以下摘自于 http://blog.csdn.net/zyq0335/article/details/7657465 1 什么是多态? 多态性可以简单的概括为“1个接口,多种方法”,在程序运行的过程中才决定调用的机制 程序实现上是这样,通过父类指针调用子类的函数,可以让父类指针有多种形态。 2 实现机制 举一个例子: #include <iostream.h> class animal { public: void sleep() { cout<<"animal sleep"<<endl; } void breathe() { cout<<"animal breathe"<<endl; } }; class fish:public animal { public: void breathe() { cout<<"fish bubble"<<endl; } }; void main() { fish fh; animal *pAn=&fh; pAn->breathe(); } 答案是输出:animal breathe 结果分析: 1从编译的角度 C++编译器在编译的时候,要确定每个对象调用的函数的地址,这称为早期绑定(early binding),当我们将fish类的对象fh的地址赋给pAn时,C

Effective C++ 读书笔记(1-7)

安稳与你 提交于 2020-03-18 07:23:31
作者 Scott Meyers 翻译作者 侯捷 C++ 神牛 台湾人 术语: 1.explicit C++提供了 关键字 explicit,可以阻止不应该允许的经过 转换构造函数 进行的隐式转换的发生。声明为explicit的 构造函数 不能在隐式转换中使用。但他们仍然可以用来进行显示转换。 示例: class Test1 { public: Test1(int n) { num = n; } //普通构造函数 private: int num; }; class Test2 { public: explicit Test2(int n) { num = n; } //explicit(显式)构造函数 private: int num; }; int main() { Test1 t1 = 12; //隐式调用其构造函数, 成功 Test2 t2 = 12; //编译错误,不能隐式调用其构造函数 Test2 t3(12); //显式调用成功 return 0; } 2 undefined behavior int *p=0; //p其实是一个NULL指针 std::cout<<*p;//对一个NULL指针取值会导致不明确行为。 条款一: 封装 encapsulation、继承 inheritance、多态 polymorphism 在STL中,迭代器和函数对象都是在C指针之上塑造的

我是否需要显式调用基本虚拟析构函数?

断了今生、忘了曾经 提交于 2020-03-17 01:18:35
某厂面试归来,发现自己落伍了!>>> 当用C ++覆盖一个类(使用虚拟析构函数)时,我在继承类上再次将析构函数实现为虚拟,但是我是否需要调用基本析构函数? 如果是这样,我想它就是这样...... MyChildClass::~MyChildClass() // virtual in header { // Call to base destructor... this->MyBaseClass::~MyBaseClass(); // Some destructing specific to MyChildClass } 我对吗? #1楼 不,你永远不会调用基类析构函数,它总是像其他人指出的那样自动调用,但这里是结果的概念证明: class base { public: base() { cout << __FUNCTION__ << endl; } ~base() { cout << __FUNCTION__ << endl; } }; class derived : public base { public: derived() { cout << __FUNCTION__ << endl; } ~derived() { cout << __FUNCTION__ << endl; } // adding call to base::~base() here results in

C++学习笔记--从虚函数说开去

。_饼干妹妹 提交于 2020-03-14 04:28:03
虚函数与纯虚函数 : 虚函数:在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数,virtual 函数返回类型 函数名(参数表){函数体;} ,实现多态性, 通过指向派生类的基类指针或引用 ,访问派生类中同名覆盖成员函数。注意虚函数在基类中是有定义的,即便定义是空。 纯虚函数:在基类中是没有定义的,必须由派生类重定义实现,否则不能由对象进行调用。 看下面的例子: #include<iostream> using namespace std; class Cshape { public: void SetColor(int color){m_nColor=color;} virtual void Display(void){}; private: int m_nColor; }; class Crectangle:public Cshape{ //公有继承 public: }; void main() { Crectangle obRectangle; Cshape* pShape=&obRectangle; pShape->Display(); } 上面例子中,Display是虚函数,虽然是空定义,并且在派生类中没有重写该函数,但是上面的代码在编译阶段不会出错,而是在链接时出错,而如果将Display声明为纯虚函数,即 virtual void Display

Hello China操作系统在Virtual PC上的安装和使用

你说的曾经没有我的故事 提交于 2020-03-13 18:48:26
本文介绍如何在Windows 7操作系统和Virtual PC 2007虚拟机上安装Hello China操作系统,Hello China的版本是V1.75。对于Windows XP等非Windows 7操作系统,由于不能直接支持虚拟硬盘,不能按照本文介绍的方法安装Hello China的GUI功能,但是可以安装内核和基于字符界面的shell。 HelloChina在Virtual PC上的启动过程 首先介绍一下Hello ChinaV1.75在Virtual PC上的启动过程。为了最大可能的降低安装和使用的复杂性,V1.75版本在Virtual PC上是通过虚拟软盘启动的。Hello China的内核和核心驱动程序(比如键盘驱动、鼠标驱动、IDE接口硬盘驱动、文件系统等)等文件都集成在了虚拟软盘中。这样通过虚拟软盘启动计算机,操作系统的核心模块就直接从虚拟软盘中加载到内存并执行。内核初始化完成之后,Hello China会进入字符shell模式,这时候用户就可以运行字符模式命令了。 在字符模式下,用户输入GUI命令,即可进入图形模式的shell。一旦用户输入gui命令,Hello China会在硬盘的第一个分区(用C:标识,与Windows类似)的PTHOUSE目录下,寻找hcngui.bin文件,这个文件即是Hello China图形模式模块的可执行二进制文件。一旦找到这个文件