不可或缺 Windows Native (23) - C++: 虚函数
作者:webabcd
介绍
不可或缺 Windows Native 之 C++
- 虚函数
示例
1、基类
CppHuman.h
- #pragma once
- #include <string>
- using namespace std;
- namespace NativeDll
- {
- class CppHuman
- {
- protected:
- string Name;
- public:
- // 我是虚函数
- virtual string Show();
- // 我是纯虚函数(后面的“=0”只起形式上的作用,用于告诉编译器:“这是纯虚函数”)
- // 纯虚函数只有声明,没有定义,其具体的功能是留给派生类定义的
- // 凡是包含纯虚函数的类都是抽象类,抽象类是无法实例化的,因为纯虚函数是不能被调用的
- // virtual string Display() = 0;
- CppHuman(string name);
- // 我是 virtual 的析构函数
- virtual ~CppHuman();
- };
- }
CppHuman.cpp
- /*
- * 基类
- */
- #include "pch.h"
- #include "CppHuman.h"
- #include "cppHelper.h"
- using namespace NativeDll;
- string CppHuman::Show()
- {
- return "human: " + Name;
- }
- CppHuman::CppHuman(string name) : Name(name)
- {
- }
- CppHuman::~CppHuman()
- {
- }
2、派生类
CppChild.h
- #pragma once
- #include <string>
- #include "CppHuman.h"
- using namespace std;
- namespace NativeDll
- {
- class CppChild : public CppHuman
- {
- public:
- // 由于基类 CppHuman 的 Show() 函数是虚函数,所以其所有直接或间接派生类中,如果声明了此函数则均为虚函数(virtual 可以省略)
- virtual string Show();
- CppChild(string name);
- ~CppChild();
- };
- }
CppChild.cpp
- /*
- * 派生类(基类是 CppHuman)
- */
- #include "pch.h"
- #include "CppChild.h"
- #include "cppHelper.h"
- using namespace NativeDll;
- string CppChild::Show()
- {
- return "child: " + Name;
- }
- CppChild::CppChild(string name) : CppHuman(name)
- {
- }
- CppChild::~CppChild()
- {
- }
3、示例
CppClass7.h
- #pragma once
- #include <string>
- using namespace std;
- namespace NativeDll
- {
- class CppClass7
- {
- public:
- string Demo();
- };
- }
CppClass7.cpp
- /*
- * 虚函数
- */
- #include "pch.h"
- #include "CppClass7.h"
- #include "CppChild.h"
- using namespace NativeDll;
- void cppclass7_demo1();
- void cppclass7_demo2();
- string CppClass7::Demo()
- {
- // 虚函数
- cppclass7_demo1();
- // virtual 的析构函数
- cppclass7_demo2();
- return "看代码及注释吧";
- }
- // 虚函数
- void cppclass7_demo1()
- {
- // 不使用虚函数的示例:参见 CppClass5.cpp 中的“基类与派生类的转换”
- // 以下演示了如何使用虚基类
- CppHuman human("webabcd");
- CppChild child("diandian");
- // 指针指向基类,调用虚函数后执行的是基类的虚函数
- CppHuman *humanPointer = &human;
- string result = humanPointer->Show(); // human: webabcd
- // 指向基类的指针改为指向派生类,调用虚函数后执行的是派生类的虚函数
- humanPointer = &child;
- result = humanPointer->Show(); // child: diandian
- // 像上面这种方式是在程序运行阶段把虚函数和类对象“绑定”在一起的,因此此过程称为动态关联(dynamic binding)或滞后关联(late binding),其属于动态多态性
- // 如果使用了虚函数,则编译器会为该类构造一个虚函数表(virtual function table,简称 vtable),它是一个指针数组,存放每个虚函数的入口地址,据此可做静态关联和动态关联
- }
- // virtual 的析构函数
- void cppclass7_demo2()
- {
- // 一般来说,清理派生类时,会先调用派生类的析构函数,然后调用基类的析构函数
- // 但是下面这种情况例外
- CppHuman *pt = new CppChild("diandian");
- delete pt;
- // 此时,如果基类的析构函数不是 virtual 的,则只会执行基类的析构函数
- // 此时,如果基类的析构函数是 virtual 的,则会先执行派生类的析构函数,再执行基类的析构函数
- // 所以,最好把基类的析构函数声明为虚函数(其会使所有派生类的析构函数都自动变为虚函数),以避免清理不彻底
- }
OK
[源码下载]
不可或缺 Windows Native (23) - C++: 虚函数的更多相关文章
- 不可或缺 Windows Native (20) - C++: 友元函数, 友元类
[源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...
- 不可或缺 Windows Native (6) - C 语言: 函数
[源码下载] 不可或缺 Windows Native (6) - C 语言: 函数 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 函数 示例cFunction.h # ...
- 不可或缺 Windows Native 系列文章索引
[源码下载] 不可或缺 Windows Native 系列文章索引 作者:webabcd 1.不可或缺 Windows Native (1) - C 语言: hello c 介绍不可或缺 Window ...
- 不可或缺 Windows Native (22) - C++: 多重继承, 虚基类
[源码下载] 不可或缺 Windows Native (22) - C++: 多重继承, 虚基类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 多重继承 虚基类 示例1 ...
- 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板
[源码下载] 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板 作者:webabcd 介绍不可或缺 Windows Native 之 C++ ...
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
[源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...
- 不可或缺 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 ...
- 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换
[源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...
- 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板
[源码下载] 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板 作者:webabcd 介绍不可或缺 Window ...
随机推荐
- C语言再学习之内存对齐
昨天看Q3的代码,看到有个_INTSAIZEOF的宏,着实晕了一阵.一番google后,终于明白,这个宏的作用是求出变量占用内存空间的大小,先看看_INTSAIZEOF的定义吧: #define _I ...
- vim添加或删除多行注释
一.多行注释的添加 1. vim的命令模式下(ESC 进入命令模式): 2. 按CTRL+V进入可视化模式(VISUAL BLOCK): 注意:vim命令模式下v进入的是visual模式,ctrl+v ...
- Axis 1 https(SSL) client 证书验证错误ValidatorException workaround
Axis 1.x 编写的client在测试https的webservice的时候, 由于client 代码建立SSL连接的时候没有对truststore进行设置,在与https部署的webservic ...
- Objective-C实现发短信和接电话
发短信: [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"sms://10000"]]; 打电话: ...
- 每天一个linux命令(11):nl命令
nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...
- css_04之显示、定位
1.显示方式:display:取值:none(隐藏,不占页面空间,脱离文档流)/block(元素变为块级)/inline(元素变为行内)/inline-block(元素变为行内块): 2.显示效果:v ...
- JavaScript使用正则表达
正则表达式概述 在前面已经涉及了一些正则表达式的用法,现在将系统地学习正则表达式的语法和用途.正则表达式主要用于进行字符串的模式匹配,例如判断一个字符串是否符合指定格式等.例如在windows下搜索文 ...
- .NET面试题解析(05)-常量、字段、属性、特性与委托
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 弱小和无知不是生存的障碍,傲慢才是!——<三体> 常见面试题目: 1. const和reado ...
- ES6入门系列三(特性总览下)
0.导言 最近从coffee切换到js,代码量一下子变大了不少,也多了些许陌生感.为了在JS代码中,更合理的使用ES6的新特性,特在此对ES6的特性做一个简单的总览. 1.模块(Module) --C ...
- 重置Oracle密码
在系统运行中输入: sqlplus /nolog 在命令窗口分别执行: conn /as sysdba alter user scott identified by tiger; alter user ...