不可或缺 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 ...
随机推荐
- osgi dm
看了http://developer.51cto.com/art/200909/154863.htm 真心感到,最强大最有组织的技术网站还是 51cto,牛人应该也是最多的. 以前逛51cto的比较少 ...
- 说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现
返回目录 为何要设计多功能消息组件 之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以 ...
- MVVM架构~knockoutjs系列之验证信息自定义输出
返回目录 这个文章非常重要,也是非常必要的,在我们进行项目开发时,后台无所谓,对样式无要求,而网站前台来说,对样式要求严格,你的验证信息都是前台设计好的,所以,不能使用knockoutjs自带的了,我 ...
- Java的String字符串内容总结
String--字符串 获取字符串的长度 使用Sring类的length()方法可获取字符串对象的长度,例: str.length(); str代表指定的字符串对象;返回值为返回指定字符串的长度.例: ...
- CAR
24.编写一个Car类,具有String类型的属性品牌,具有功能drive: 定义其子类Aodi和Benchi,具有属性:价格.型号:具有功能:变速: 定义主类E,在其main方法中分别创建Aodi和 ...
- [数据库连接池] Java数据库连接池--DBCP浅析.
前言对于数据库连接池, 想必大家都已经不再陌生, 这里仅仅设计Java中的两个常用数据库连接池: DBCP和C3P0(后续会更新). 一. 为何要使用数据库连接池假设网站一天有很大的访问量,数据库服务 ...
- Atitti 跨语言异常的转换抛出 java js
Atitti 跨语言异常的转换抛出 java js 异常的转换,直接反序列化为json对象e对象即可.. Js.没有完整的e机制,可以参考java的实现一个stack层次机制的e对象即可.. 抛出Ru ...
- jQuery_03之事件、动画、类数组操作
一.事件: 1.模式触发事件: ①DOM:elem.onXXX();只能触发直接用onXXX绑定的事件处理函数:用addEventistener添加的事件监听无法模拟出发触发: ②jQuery:$ ...
- ASPNET_WEBAPI快速学习02
这部分内容的学习,已经放了大半年时间了,果断补充上,尽早将过去遗留的老技术坑都补上.首先将介绍服务幂等性的概念和相关解决方案,这部分也将是本文的理解难点,由于WebAPI是一种Restful风格服务的 ...
- 使用Source Safe for SQL Server解决数据库版本管理问题
简介 在软件开发过程中,版本控制是一个广为人知的概念.因为一个项目可能会需要不同角色人员的参与,通过使用版本控制软件,可以使得项目中不同角色的人并行参与到项目当中.源代码控制使得代码可以存在多 ...