虚函数

第52课 C++中的抽象类和接口

拟墨画扇 提交于 2019-12-06 06:59:11
什么是抽象类 面向对象中的抽象概念 在进行面向对象分析时,会发现一些抽象的概念 图形的面积如何计算? 在现实中需要知道具体的图形类型才能求面积,所以对概念上的图形求面积是没有意义的 class Shape { public: double area() { return 0; } }; Shape只是一个概念上的类型,没有具体的对象。 面向对象中的抽象类 -可用于表示 现实世界中的抽象概念 -是一种 只能定义类型,而不能产生对象的类 -只能被 继承并重写相关函数 -直接特征是 相关函数没有完整的实现 Shape是现实世界中各种图形的抽象概念 因此: -程序中必须能够反映抽象的图形 -程序中通过抽象类表示图形的概念 -抽象类不能创建对象,只能用于继承 抽象类与纯虚函数 C++语言中 没有抽象类 的概念 C++中通过 纯虚函数 实现抽象类 纯虚函数是指 只定义原型的成员函数 一个C++类中 存在纯虚函数 就成了抽象类 纯虚函数的语法规则 class Shape { public: virtual double area() = 0; }; "=0"用于告诉编译器当前是声明纯虚函数,因此不需要定义函数体 #include <iostream> #include <string> using namespace std; class Shape { public: virtual

C++ 虚函数的说明

半腔热情 提交于 2019-12-06 06:43:38
虚函数的几点说明: 1. 当一个成员函数定义为虚函数时, 其派生类中的同名函数 也自动为虚函数。无论其是否添加了 virtual 关键字。 为了能良好的阅读代码,请加上。 2. 父类的虚函数,就是为了让子类中的同名成员函数覆盖。这样,父类对象的指针就可以指向子类对象,并调用子类的同名函数。 3. 纯虚函数。用于定义接口。父类中可能不能(或者无意义)定义该函数的实现。 来源: https://www.cnblogs.com/alexYuin/p/11966263.html

纯虚函数==0

旧时模样 提交于 2019-12-05 22:21:59
#include <iostream> class Base { public: virtual ~Base()=0; // 纯虚析构函数 }; Base::~Base() { std::cout << "Pure virtual destructor is called\n"; } class Derived : public Base { public: ~Derived() { std::cout << "~Derived() is executed\n"; } }; int main() { Base *b = new Derived(); delete b; return 0; 原文链接:https://blog.csdn.net/shltsh/article/details/46000003 来源: https://www.cnblogs.com/hshy/p/11947498.html

C/C++数据类型判断与转换

假如想象 提交于 2019-12-05 22:14:51
     最近总想着写一些通用的代码,然集中收纳到自己的私人库中去,这些代码期望能与公司基础数据结构无关。然而这比较难,因为无论如何,必需要用到一些结构 化的东西,这些与基础引擎等有关,必需极度抽象才可以做到层层分离,于是我想将分两个层级,一级模版代码,只支持标准C++的东西,存入库中;二级代码,这些作为普通常函数,将会引擎一些引擎级别的数据,尽量通用;三级则是应用实例代码。   如此一来必需有类型判断和通用的结构,以下收集一些数据类型处理的的方法。 一、typeid   typeid 和 sizeof一样是个运算符,eg. int a; if(typeid(a) == typeid(int)) cout<<"int";   另外 typeid( int).name() 返回值 为string 或者char*,可据此检测类型。 二、类型转换   1、隐式转换,当数据参与运算时,不同类型将被自动转换                                 数据类型排名 long double double float unsigned long long int long long int unsigned long int long int unsigned int int     char、short 和 unsigned short 值自动升级为 int 值;    

Windows Hook经验总结之四:COM组件Hook原理及实践

两盒软妹~` 提交于 2019-12-05 19:27:29
前面 已经介绍过API的hook方法及具体实践,本文则讲述COM组件的Hook方式。COM组件可简单理解为一个二进制可执行程序或DLL,内部包含一系列的接口和函数。Hook COM本质上也是进行函数地址切换,让它跳到我们自定义的函数执行我们想要的功能。但这一切同样是发生在系统架构下,自定义函数的执行时机不由我们触发。 一次完整的Hook流程包括以下三步: 定位COM,确定自己需要hook的目标。可以从msdn和vs sdk上寻求帮助,获取目标COM的接口细节,比如组件的CLSID、接口的IID等信息,可关注shellapi.h、shobjidl.h等头文件。 参考目标COM的接口信息,实现自定义的COM功能。 将自定义COM注册生效。 本文以IFileOperation的文件拷贝接口为例进行阐述。 定位COM XP时代,文件目录操作以一个个独立的API函数形式存在于kernel32.dll中,如CopyFile、CreateDirectory、DeleteFile等。WIN7之后,微软改了这一层的实现,改用IFileOperation囊括原有的API集。当然,这一信息来自baidu、msdn。然后就是确定IFileOperation的接口虚函数表,这个已在vs2008的shobjidl.h头文件中声明,摘录如下。 IFileOperation : public IUnknown {

多态

醉酒当歌 提交于 2019-12-05 19:07:36
1.继承和虚函数 1)没有继承时虚函数表 Base结构,里面有3个函数:Function1、Function2、Function3; 虚表: 2)单继承无函数覆盖 Base结构: Function1、2、3; Sub结构继承Base: Function4、5、6; 虚表: 子类对象的虚表中包含子类和父类的全部虚函数; 3)单继承有函数覆盖 Base: Function1、2、3; Sub继承Base: Function1、2、6; 虚表: 虚表中包含子类中的全部虚函数和父类中没有被覆盖的虚函数; 4)多继承无覆盖 Base1: Function1、2; Base2: Function3、4; Sub继承了Base1和Base2: Function5、6; 虚表: 有两个虚表; 虚表1中有Base1和Sub中的所有虚函数; 虚表2中有Base2中所有的虚函数; Sub结构相对没有虚函数的结构于多了8个字节; 也就是说,有几个虚表结构中就需要保存几个虚表的地址; 5)多继承有覆盖 Base1: Function1、2; Base2: Function3、4; Sub继承Base1和Base2: Function1、3、5; 虚表: 子类对象覆盖了哪个函数,就将覆盖后的函数的地址放在哪个被覆盖函数的父类的虚表中; 子类特有的函数放第一个虚表中; 6)多重继承无覆盖 Base1:

c++.net学习笔记

断了今生、忘了曾经 提交于 2019-12-04 23:17:18
Notes for c++ learning 程序根据什么特征来区分调用哪个重载函数? 只能靠参数而不能靠返回值类型的不同来区分重载函数。 编译器根据参数为每个重载函数产生不同的内部标识符 在Visual Studio .Net开发环境中,在代码编辑器内输人对象的名称后将自动显示出对应的属性、方法、事件列表,以方便选择和避免书写错误,这种技术被称为_智能感知_ 一个解决方案可以有多个项目 CLR是公共语言运行库 跟踪句柄——(gcnew)相当于c语言的指针 引用不分配内存——不能为空,因为不是定义一个变量,只表示是该用户名是目标变量名的一个别名。 引用前面用&符号,引用使用很简单比较指针(某一变量的位置)。 引用是给某一变量多取一个别名,当建立引用时,程序用另一个变量或对象目标的名字初始化它。缺点是定义之后不能改变8 托管代码和非托管代码:为CLR而编写以及使用CLR服务的代码叫"托管代码",而那些未使用CLR服务的代码(也就是你多年以来一直编写的代码),依赖于平台和语言叫"非托管代码"。 rand()_生成伪随机数;rand()%max表示产生0-max的随机数;a+rand()%(b-a+1)表示产生【a,b】之间的整数。产生不重复的随机数 array与arraylist:array是本地的程序组件或者数据结构,但是arraylist是一个来自Java集合类的类,一个接口

C++虚函数以及虚函数表

China☆狼群 提交于 2019-12-04 22:00:30
在了解虚函数之前先了解下对象模型: 对象模型: 在C++中,有两种数据成员(class data members):static 和nonstatic,以及三种类成员函数(class member functions):static、nonstatic和virtual: 说明:采用的是非继承下的C++对象模型: nonstatic 数据成员被置于每一个类对象中,而static数据成员被置于类对象之外。static与nonstatic函数也都放在类对象之外,而对于virtual 函数,则通过虚函数表+虚指针来支持,具体如下: 每个类生成一个表格,称为虚表(virtual table,简称vtbl)。虚表中存放着一堆指针,这些指针指向该类每一个虚函数。虚表中的函数地址将按声明时的顺序排列,不过当子类有多个重载函数时例外。 每个类对象都拥有一个虚表指针(vptr),由编译器为其生成。虚表指针的设定与重置皆由类的复制控制(也即是构造函数、析构函数、赋值操作符)来完成。vptr的位置为编译器决定,传统上它被放在所有显示声明的成员之后,不过现在许多编译器把vptr放在一个类对象的最前端。 另外,虚函数表的前面设置了一个指向type_info的指针,用以支持RTTI(Run Time Type Identification,运行时类型识别)。RTTI是为多态而生成的信息,包括对象继承关系

C++ 虚函数

北战南征 提交于 2019-12-04 16:24:52
父类函数不加virtual关键词,子类继承后,当父类指针指向子类指针,同样的函数,会执行父类的函数。子类的函数实际是被隐藏了,如果用子类的指针指向自己的话,是能够执行的。 #include <iostream> /** * C++多态 虚函数 */ using namespace std; class Shape { public: Shape(); ~Shape(); double calcArea(); }; class Circle : public Shape { public: Circle(double r); ~Circle(); double calcArea(); protected: double m_dR; protected: string m_strName; }; class Rect : public Shape { public: Rect(double width, double height); ~Rect(); double calcArea(); protected: double m_dWidth; double m_dHeight; }; Rect::Rect(double width, double height) { m_dHeight = height; m_dWidth = width; cout << "Rect::Rect()

父类子类指针相互转换问题

核能气质少年 提交于 2019-12-04 14:20:36
父类子类指针相互转换问题 1.当自己的类指针指向自己类的对象时,无论调用的是虚函数还是实函数,其调用的都是自己的: 2.当指向父类对象的父类指针被强制转换成子类指针时候,子类指针调用函数时,只有非重写函数是自己的,虚函数是父类的; 3.当指向子类对象的子类指针被强制转换成父类指针的时候,也就是父类指针指向子类对象,此时,父类指针调用的虚函数都是子类的,而非虚函数都是自己的; 将上面三句话总结成一句话就是: 当父类子类有同名非虚函数的时候,调用的是转换后的指针类型的函数;               当父类子类有同名虚函数的时候呢,调用的是指针转换前指向的对象类型的函数。 详见以下代码: 1 #include <iostream> 2 using namespace std; 3 class Base { 4 public: 5 virtual void f() { cout << "Base::f" << endl; } 6 virtual void g() { cout << "Base::g" << endl; } 7 void h() { cout << "Base::h" << endl; } 8 9 }; 10 class Derived:public Base 11 { 12 public: 13 virtual void f(){cout<<"Derived::f"<