[源码下载]

不可或缺 Windows Native (23) - C++: 虚函数

作者:webabcd

介绍
不可或缺 Windows Native 之 C++

  • 虚函数

示例
1、基类
CppHuman.h

  1. #pragma once
  2.  
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. namespace NativeDll
  8. {
  9. class CppHuman
  10. {
  11.  
  12. protected:
  13. string Name;
  14.  
  15. public:
  16. // 我是虚函数
  17. virtual string Show();
  18.  
  19. // 我是纯虚函数(后面的“=0”只起形式上的作用,用于告诉编译器:“这是纯虚函数”)
  20. // 纯虚函数只有声明,没有定义,其具体的功能是留给派生类定义的
  21. // 凡是包含纯虚函数的类都是抽象类,抽象类是无法实例化的,因为纯虚函数是不能被调用的
  22. // virtual string Display() = 0;
  23.  
  24. CppHuman(string name);
  25.  
  26. // 我是 virtual 的析构函数
  27. virtual ~CppHuman();
  28.  
  29. };
  30. }

CppHuman.cpp

  1. /*
  2. * 基类
  3. */
  4.  
  5. #include "pch.h"
  6. #include "CppHuman.h"
  7. #include "cppHelper.h"
  8.  
  9. using namespace NativeDll;
  10.  
  11. string CppHuman::Show()
  12. {
  13. return "human: " + Name;
  14. }
  15.  
  16. CppHuman::CppHuman(string name) : Name(name)
  17. {
  18.  
  19. }
  20.  
  21. CppHuman::~CppHuman()
  22. {
  23.  
  24. }

2、派生类
CppChild.h

  1. #pragma once
  2.  
  3. #include <string>
  4. #include "CppHuman.h"
  5.  
  6. using namespace std;
  7.  
  8. namespace NativeDll
  9. {
  10. class CppChild : public CppHuman
  11. {
  12.  
  13. public:
  14. // 由于基类 CppHuman 的 Show() 函数是虚函数,所以其所有直接或间接派生类中,如果声明了此函数则均为虚函数(virtual 可以省略)
  15. virtual string Show();
  16.  
  17. CppChild(string name);
  18.  
  19. ~CppChild();
  20.  
  21. };
  22. }

CppChild.cpp

  1. /*
  2. * 派生类(基类是 CppHuman)
  3. */
  4.  
  5. #include "pch.h"
  6. #include "CppChild.h"
  7. #include "cppHelper.h"
  8.  
  9. using namespace NativeDll;
  10.  
  11. string CppChild::Show()
  12. {
  13. return "child: " + Name;
  14. }
  15.  
  16. CppChild::CppChild(string name) : CppHuman(name)
  17. {
  18.  
  19. }
  20.  
  21. CppChild::~CppChild()
  22. {
  23.  
  24. }

3、示例
CppClass7.h

  1. #pragma once
  2.  
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. namespace NativeDll
  8. {
  9. class CppClass7
  10. {
  11. public:
  12. string Demo();
  13. };
  14. }

CppClass7.cpp

  1. /*
  2. * 虚函数
  3. */
  4.  
  5. #include "pch.h"
  6. #include "CppClass7.h"
  7. #include "CppChild.h"
  8.  
  9. using namespace NativeDll;
  10.  
  11. void cppclass7_demo1();
  12. void cppclass7_demo2();
  13.  
  14. string CppClass7::Demo()
  15. {
  16. // 虚函数
  17. cppclass7_demo1();
  18.  
  19. // virtual 的析构函数
  20. cppclass7_demo2();
  21.  
  22. return "看代码及注释吧";
  23. }
  24.  
  25. // 虚函数
  26. void cppclass7_demo1()
  27. {
  28. // 不使用虚函数的示例:参见 CppClass5.cpp 中的“基类与派生类的转换”
  29.  
  30. // 以下演示了如何使用虚基类
  31. CppHuman human("webabcd");
  32. CppChild child("diandian");
  33.  
  34. // 指针指向基类,调用虚函数后执行的是基类的虚函数
  35. CppHuman *humanPointer = &human;
  36. string result = humanPointer->Show(); // human: webabcd
  37.  
  38. // 指向基类的指针改为指向派生类,调用虚函数后执行的是派生类的虚函数
  39. humanPointer = &child;
  40. result = humanPointer->Show(); // child: diandian
  41.  
  42. // 像上面这种方式是在程序运行阶段把虚函数和类对象“绑定”在一起的,因此此过程称为动态关联(dynamic binding)或滞后关联(late binding),其属于动态多态性
  43. // 如果使用了虚函数,则编译器会为该类构造一个虚函数表(virtual function table,简称 vtable),它是一个指针数组,存放每个虚函数的入口地址,据此可做静态关联和动态关联
  44. }
  45.  
  46. // virtual 的析构函数
  47. void cppclass7_demo2()
  48. {
  49. // 一般来说,清理派生类时,会先调用派生类的析构函数,然后调用基类的析构函数
  50. // 但是下面这种情况例外
  51. CppHuman *pt = new CppChild("diandian");
  52. delete pt;
  53. // 此时,如果基类的析构函数不是 virtual 的,则只会执行基类的析构函数
  54. // 此时,如果基类的析构函数是 virtual 的,则会先执行派生类的析构函数,再执行基类的析构函数
  55. // 所以,最好把基类的析构函数声明为虚函数(其会使所有派生类的析构函数都自动变为虚函数),以避免清理不彻底
  56. }

OK
[源码下载]

不可或缺 Windows Native (23) - C++: 虚函数的更多相关文章

  1. 不可或缺 Windows Native (20) - C++: 友元函数, 友元类

    [源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...

  2. 不可或缺 Windows Native (6) - C 语言: 函数

    [源码下载] 不可或缺 Windows Native (6) - C 语言: 函数 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 函数 示例cFunction.h # ...

  3. 不可或缺 Windows Native 系列文章索引

    [源码下载] 不可或缺 Windows Native 系列文章索引 作者:webabcd 1.不可或缺 Windows Native (1) - C 语言: hello c 介绍不可或缺 Window ...

  4. 不可或缺 Windows Native (22) - C++: 多重继承, 虚基类

    [源码下载] 不可或缺 Windows Native (22) - C++: 多重继承, 虚基类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 多重继承 虚基类 示例1 ...

  5. 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板

    [源码下载] 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板 作者:webabcd 介绍不可或缺 Windows Native 之 C++ ...

  6. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  7. 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native

    [源码下载] 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native 作者:web ...

  8. 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换

    [源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...

  9. 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板

    [源码下载] 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板 作者:webabcd 介绍不可或缺 Window ...

随机推荐

  1. C语言再学习之内存对齐

    昨天看Q3的代码,看到有个_INTSAIZEOF的宏,着实晕了一阵.一番google后,终于明白,这个宏的作用是求出变量占用内存空间的大小,先看看_INTSAIZEOF的定义吧: #define _I ...

  2. vim添加或删除多行注释

    一.多行注释的添加 1. vim的命令模式下(ESC 进入命令模式): 2. 按CTRL+V进入可视化模式(VISUAL BLOCK): 注意:vim命令模式下v进入的是visual模式,ctrl+v ...

  3. Axis 1 https(SSL) client 证书验证错误ValidatorException workaround

    Axis 1.x 编写的client在测试https的webservice的时候, 由于client 代码建立SSL连接的时候没有对truststore进行设置,在与https部署的webservic ...

  4. Objective-C实现发短信和接电话

    发短信: [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"sms://10000"]]; 打电话: ...

  5. 每天一个linux命令(11):nl命令

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  6. css_04之显示、定位

    1.显示方式:display:取值:none(隐藏,不占页面空间,脱离文档流)/block(元素变为块级)/inline(元素变为行内)/inline-block(元素变为行内块): 2.显示效果:v ...

  7. JavaScript使用正则表达

    正则表达式概述 在前面已经涉及了一些正则表达式的用法,现在将系统地学习正则表达式的语法和用途.正则表达式主要用于进行字符串的模式匹配,例如判断一个字符串是否符合指定格式等.例如在windows下搜索文 ...

  8. .NET面试题解析(05)-常量、字段、属性、特性与委托

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 弱小和无知不是生存的障碍,傲慢才是!——<三体> 常见面试题目: 1. const和reado ...

  9. ES6入门系列三(特性总览下)

    0.导言 最近从coffee切换到js,代码量一下子变大了不少,也多了些许陌生感.为了在JS代码中,更合理的使用ES6的新特性,特在此对ES6的特性做一个简单的总览. 1.模块(Module) --C ...

  10. 重置Oracle密码

    在系统运行中输入: sqlplus /nolog 在命令窗口分别执行: conn /as sysdba alter user scott identified by tiger; alter user ...